Compare commits

..

305 Commits

Author SHA1 Message Date
323c1ab6a9 Dockerfile aktualisiert
All checks were successful
Build and push image / build (push) Successful in 20m6s
2024-02-06 17:11:49 +00:00
d71926b967 package.json aktualisiert
Some checks failed
Build and push image / build (push) Failing after 19m50s
2024-02-06 15:17:21 +00:00
ab1578e5b0 .gitea/workflows/build.yaml aktualisiert
Some checks failed
Build and push image / build (push) Has been cancelled
2024-02-06 00:02:36 +00:00
Simon Zeyer
1edf238a6b rename folder structure 2024-02-05 23:25:03 +00:00
6cdb2c8e81 .gitea / workflows / build.yaml aktualisiert 2024-02-05 23:13:36 +00:00
42e3718fea Merge pull request '.gitea / workflows / build.yaml hinzugefügt' (#2) from feature/sz/build-actions-runner into master
Reviewed-on: #2
2024-02-05 23:11:26 +00:00
6eb9293879 .gitea / workflows / build.yaml hinzugefügt 2024-02-05 23:10:00 +00:00
681b36c34d revert de6af2d8cc48276a1b393b5ab6a6ba278bf4f761
revert Merge pull request 'feature/sz/build-actions-runner' (#1) from feature/sz/build-actions-runner into master

Reviewed-on: #1
2024-02-05 23:08:23 +00:00
de6af2d8cc Merge pull request 'feature/sz/build-actions-runner' (#1) from feature/sz/build-actions-runner into master
Reviewed-on: #1
2024-02-05 23:07:05 +00:00
2b11b9399b .github/ISSUE_TEMPLATE/build.yaml aktualisiert 2024-02-05 23:05:59 +00:00
dd8c615cd0 .github/ISSUE_TEMPLATE/build.yaml hinzugefügt 2024-02-05 23:00:48 +00:00
Your Name
0f47977804 multistage build, with docker compose 2023-07-03 21:54:01 +00:00
Your Name
d479f7afd0 init docker compose 2023-07-03 20:41:05 +00:00
Your Name
4d28340061 Dockerfile for building Application 2023-07-03 20:34:51 +00:00
Your Name
65184855e2 Ver01072023 2023-07-03 20:19:09 +00:00
Mario Pesch
20652daf92
Merge pull request #241 from sensebox/fix/update-bsec-code
update bsec code
2023-05-11 14:30:23 +02:00
Mario Pesch
ebd945711a update bsec code
update bsec code due to breaking changes in latest library version
2023-05-11 14:16:10 +02:00
Mario Pesch
a969727a48
Merge pull request #240 from sensebox/fix/alway-include-senseboxIO
add senseBoxIO to main procedure
2023-05-08 14:26:01 +02:00
Mario Pesch
a1167b436b add senseBoxIO to main procedure 2023-05-08 14:20:25 +02:00
Mario Pesch
7524e78fc6
Merge pull request #239 from sensebox/development
Development
2023-04-03 12:46:22 +02:00
Mario Pesch
f8cfb6691b
Merge pull request #238 from sensebox/dev/update-mini-ports
update ports for senseBox MCU mini
2023-04-03 12:39:04 +02:00
Mario Pesch
abce42f764
Merge pull request #237 from sensebox/dev/button_asSwitch
add Button as Switch
2023-04-03 12:35:07 +02:00
Mario Pesch
7c60869124 add Button as Switch 2023-04-03 12:26:43 +02:00
Mario Pesch
2f4538dc89 update ports for senseBox MCU mini 2023-03-30 10:31:05 +02:00
Mario Pesch
d87e47205f
Merge pull request #236 from sensebox/development
fix getSelected block
2023-02-14 10:13:57 +01:00
Mario Pesch
7ca5287b86 fix getSelected block 2023-02-14 09:55:17 +01:00
Mario Pesch
67bac98e65
Merge pull request #199 from sensebox/development
Development
2023-02-13 16:24:20 +01:00
Mario Pesch
2ea773601e fix double var declaration 2023-02-13 16:10:43 +01:00
Mario Pesch
7969bf2ed7
Merge pull request #235 from sensebox/dev/fix-navbar-visibility
fix navbar visibility
2023-02-12 17:49:29 +01:00
Frederick Bruch
684417750a
Merge branch 'development' into dev/fix-navbar-visibility 2023-02-10 13:59:44 +01:00
fbruc03
df4db30c72 navbar only on root and md breakpoint 2023-02-10 13:56:01 +01:00
Mario Pesch
2064fa2fb3
Merge pull request #234 from sensebox/dev/fix-gallery
fix gallery
2023-02-10 12:15:55 +01:00
Mario Pesch
98f97d6313 fix gallery 2023-02-10 12:04:10 +01:00
Mario Pesch
ace2237529
Merge pull request #233 from sensebox/dev/update-blockly-v9
Dev/update blockly v9
2023-02-06 17:59:49 +01:00
Mario Pesch
07cd39f364 add account to navbar 2023-02-06 17:56:05 +01:00
Mario Pesch
02de052879 update blockly to v9 2023-02-06 17:55:57 +01:00
Mario Pesch
ade6f3d4bd
Merge branch 'master' into development 2023-02-06 15:06:50 +01:00
Mario Pesch
53d7c77eb5
Merge pull request #229 from sensebox/dev/newNavbarFeatures
add new navbar
2023-02-06 14:53:13 +01:00
fbruc03
426d618769 fix XML on change 2023-02-06 12:57:23 +01:00
Mario Pesch
69f3bf1db0
Merge pull request #231 from sensebox/fix-bme-dimension
hPa -> Pa
2023-01-13 07:43:15 +01:00
fbruc03
e1b659cda5 menu anchor always on button 2023-01-12 23:30:32 +01:00
fbruc03
2c1594227e style navbar items 2023-01-12 22:30:41 +01:00
Mario Pesch
512839e1f5 hPa -> Pa 2023-01-12 15:17:09 +01:00
Mario Pesch
ec141088cc
Merge pull request #230 from sensebox/fix-rtc-hours
Update sensebox-rtc.js
2023-01-12 14:33:38 +01:00
Mario Pesch
be51eff3c8 Update sensebox-rtc.js 2023-01-12 14:30:01 +01:00
fbruc03
d05eede14f add new navbar 2023-01-12 12:39:21 +01:00
Mario Pesch
d1b3761349
Merge pull request #228 from sensebox/fix-variable-type
fix variable type in block
2023-01-10 11:51:23 +01:00
Mario Pesch
fb9e5c53ff fix variable type in block 2023-01-10 11:43:21 +01:00
Mario Pesch
cfd6fedc6e
Merge pull request #227 from sensebox/new-components
add new components
2023-01-06 17:09:18 +01:00
Mario Pesch
126606f4f5 add new components 2023-01-06 17:06:39 +01:00
Mario Pesch
a0bc371bdd
Merge pull request #220 from sensebox/dev/migrateMUI
Dev/migrate mUI
2023-01-06 12:59:59 +01:00
Mario Pesch
be8b9ebf32
Merge pull request #217 from sensebox/dev/Tutorial-Builder-Updates
only show public tutorials
2023-01-06 11:29:47 +01:00
Mario Pesch
133d013081
Merge pull request #223 from sensebox/dev/migrateMUI-fixes
fix stepper size
2023-01-02 12:54:43 +01:00
fbruc03
bf9fe05845 fix isWidthDown 2023-01-02 12:21:18 +01:00
Mario Pesch
b9884cc85d fix stepper size 2022-12-16 11:38:59 +01:00
Mario Pesch
cb12aef535
Merge pull request #222 from sensebox/block/add-internalRTC-NTP
Block/add internal rtc ntp
2022-12-14 15:39:18 +01:00
Mario Pesch
345c15ed77
Merge pull request #221 from sensebox/block/add-sps30
init implementation of sps30 block
2022-12-14 15:35:19 +01:00
Mario Pesch
b05b3017e1 remove duplicate variable 2022-12-14 13:59:31 +01:00
Mario Pesch
a4641938f0 add block for timestamp from internal rtc 2022-12-14 08:56:55 +01:00
Mario Pesch
9526b154bf add blocks for internal RTC and NTP 2022-12-13 14:44:53 +01:00
Mario Pesch
745f6940ec update tooltip 2022-12-13 09:43:24 +01:00
Mario Pesch
2874620a9f init implementation of sps30 block
closes #218
2022-12-12 10:59:27 +01:00
fbruc03
c463237bd7 undo "isRequired" deletes 2022-12-05 14:12:51 +01:00
fbruc03
ae61d2b11b complete MUI migration 2022-12-05 12:01:51 +01:00
fbruc03
8716649be7 migrateMUI next: Restructure component definitions 2022-12-04 22:05:35 +01:00
fbruc03
d6d2505a4b get rid of most errors on Home page for migration 2022-12-04 21:09:54 +01:00
Mario Pesch
77b338ffb6
Merge pull request #203 from sensebox/development-featSensorWiki
sensorwiki with tabs and only one request
2022-11-16 12:19:54 +01:00
Mario Pesch
8571f0430f Merge branch 'development-featSensorWiki' of https://github.com/sensebox/React-Ardublockly into development-featSensorWiki 2022-11-16 12:07:44 +01:00
Mario Pesch
1bfe1a26ba change to coming soon... 2022-11-16 12:07:35 +01:00
Mario Pesch
564dcc4d4a
Merge branch 'development' into development-featSensorWiki 2022-11-16 12:04:05 +01:00
Mario Pesch
50b70b4ee3
Merge pull request #216 from sensebox/development-deviceSelection
Development device selection
2022-11-16 11:56:38 +01:00
Mario Pesch
00310a49dc
Merge pull request #201 from sensebox/development-tutorialSolution
disable solution block length check
2022-11-16 11:48:40 +01:00
fbruc03
ec1eea110c fix baground mcu image 2022-11-16 11:44:16 +01:00
Mario Pesch
9bf17aed67
Merge pull request #194 from sensebox/feat/mode-query-param
Add mode query parameter for opening from inside Connect App
2022-11-16 09:51:37 +01:00
Mario Pesch
b851498fb4 only show public tutorials
closes #206
2022-11-15 18:56:10 +01:00
fbruc03
22d11773e9 save current board in session storage 2022-11-15 16:54:09 +01:00
fbruc03
2de54c0e9b rewrite board check 2022-11-15 16:30:13 +01:00
fbruc03
5974608fd8 add DeviceSelection to CodeEditor,Project+Tutorial 2022-11-15 16:22:29 +01:00
fbruc03
6fcaff9cc3 save board model to localstorage 2022-11-15 16:11:35 +01:00
Mario Pesch
f6e5d086b5
Merge pull request #214 from sensebox/codegenerator/fix-co2-zeros
fix co2 zero issue
2022-11-11 15:13:39 +01:00
Mario Pesch
50ffad0ad2 fix co2 zero issue
closes #170
2022-11-11 15:08:16 +01:00
fbruc03
f95b1b36ca fix faq video 2022-11-11 12:21:13 +01:00
Mario Pesch
3a6fd07647
Update issue templates 2022-11-11 09:55:38 +01:00
Mario Pesch
9295d92c65
Merge pull request #205 from sensebox/fix/Serial-for-Sensors
fix Serial Ports for Sensors
2022-11-10 13:34:00 +01:00
Mario Pesch
338a0aada6 fix Serial Ports for Sensors 2022-11-10 12:40:51 +01:00
fbruc03
a31195f71e fix german variable translations 2022-11-09 17:05:51 +01:00
fbruc03
506ddef7e9 solve login snackbar issue 2022-11-09 15:41:26 +01:00
fbruc03
9ac98aa06d change block data to json 2022-11-09 11:20:15 +01:00
fbruc03
a8704316ac sensorwiki with tabs and only one request 2022-11-08 15:59:09 +01:00
fbruc03
c950dbbd86 disable solution block length check 2022-11-07 10:33:45 +01:00
Mario Pesch
e00617ac78
Merge pull request #198 from sensebox/dev/update-deviceSelector
update device Selector
2022-11-04 15:50:40 +01:00
Mario Pesch
d61d0cc5c4 update device Selector 2022-11-03 20:04:39 +01:00
Mario Pesch
a528bb7378
Merge pull request #197 from sensebox/fix/variable_db
fix variable db
2022-11-03 13:14:34 +01:00
Mario Pesch
719be33756 fix variable db
closes #192
2022-11-03 13:05:55 +01:00
Mario Pesch
b40a439e16
Merge pull request #196 from sensebox/update-code-editor
bug fix:  translations do not load  on /codeeditor
2022-11-03 10:19:00 +01:00
Mario Pesch
d71ca25828 fix formatting 2022-11-03 10:12:45 +01:00
fab-scm
32303494f7 bug fix: translations do not load on /codeeditor 2022-11-02 14:06:26 +01:00
Matthias Pfeil
d983677d22
Add mode query parameter for opening from inside Connect App 2022-10-25 10:28:15 +02:00
Mario Pesch
7cceea84fb
Merge pull request #193 from sensebox/fix-getVariable
fix getVariable
2022-10-22 13:57:00 +02:00
Mario Pesch
2865610acb fix getVariable
closes #192
2022-10-22 13:52:46 +02:00
Mario Pesch
32678c1e62
Merge pull request #191 from sensebox/add-old-blockly
add old link
2022-10-21 11:38:54 +02:00
Mario Pesch
d105650e29 add old link 2022-10-21 11:36:04 +02:00
Mario Pesch
5b43a069f3
Merge pull request #142 from sensebox/development
Development
2022-10-21 11:04:12 +02:00
Mario Pesch
d4af1891d2 Delete package-lock.json 2022-10-21 11:01:06 +02:00
Mario Pesch
48be116f5b release ready 2022-10-21 10:55:39 +02:00
Mario Pesch
9cb978b071 fix String variable
closes #186
2022-09-28 11:19:55 +02:00
Mario Pesch
eb3a86a379 add blockly to navbar 2022-09-28 11:17:30 +02:00
Mario Pesch
72b6bf47ef
Merge pull request #188 from sensebox/fix-refreshToken
Fix refresh token
2022-09-28 10:54:03 +02:00
Mario Pesch
af6f165cf0
Merge branch 'development' into fix-refreshToken 2022-09-28 10:52:35 +02:00
Mario Pesch
facf4737a1
Merge pull request #187 from sensebox/add-device-selection
dialog for device selection
2022-09-28 10:18:34 +02:00
Mario Pesch
3aa9e715d2 update board definition and translations 2022-09-28 10:17:56 +02:00
fbruc03
02f0e1cf3c remove automatic logout after 15min 2022-09-27 17:16:23 +02:00
Mario Pesch
562a7b53e2 update Board definition 2022-09-27 11:02:38 +02:00
fbruc03
c74f427fd5 update outdated npm packages 2022-09-23 14:26:52 +02:00
Mario Pesch
4565b4e482 add selected Board to settings and solve component rerender 2022-09-23 11:31:44 +02:00
Mario Pesch
3af994fcc4
Merge pull request #183 from sensebox/qr-code-shorty
Qr code shorty
2022-09-22 16:54:07 +02:00
NJaku01
b212316b0b dialog for device selction 2022-09-21 15:44:56 +02:00
fab-scm
57142dc8a1 link id to 5 digits 2022-08-12 10:28:10 +02:00
Mario Pesch
e73550fc8a
Merge pull request #184 from sensebox/add-motors
Add motors
2022-08-10 12:24:52 +02:00
fab-scm
89a5c838bf Download QR Code 2022-08-09 20:55:09 +02:00
Mario Pesch
078bbe0477 update toolbox and change colour 2022-08-03 11:19:59 +02:00
Bjoern Luig
047588842c added german messages and put only servo motor in toolbox 2022-07-30 23:32:22 +02:00
fab-scm
e5e0066635 social share buttons added 2022-07-27 13:24:36 +02:00
fab-scm
69de659c11 loading spinner for shorty fetch and qr-code 2022-07-26 13:33:12 +02:00
fab-scm
c71a150f38 fetch shortlink 2022-07-25 16:42:45 +02:00
fab-scm
b97ce364ce createShortlink function 2022-07-22 13:27:42 +02:00
Mario Pesch
86c709a014 bumb blockly to v8 2022-07-20 13:36:12 +02:00
Mario Pesch
7ab3f91ed8 fix tutorial assessment view 2022-07-18 18:16:02 +02:00
Mario Pesch
426b87e84d
Merge pull request #180 from sensebox/fix/spelling-humidity
fix #179
2022-07-14 09:41:29 +02:00
Mario Pesch
51c4df2e64 fix #179
closes #179
2022-07-14 09:36:41 +02:00
Bjoern
de15bcf993 added servo and dc motor blocks 2022-07-14 00:24:37 +02:00
Bjoern
dd82781939 added blocks for simple stepper motor 2022-07-05 23:05:54 +02:00
Mario Pesch
b6da61fae0 disable redux-devtools 2022-07-05 21:48:07 +02:00
Mario Pesch
f28a8c4fe7 Merge branch 'master' into development 2022-07-05 21:42:35 +02:00
Mario Pesch
3e9d55719b
Merge pull request #156 from sensebox/update/tutorial-builder
update tutorial builder
2022-07-05 21:24:43 +02:00
Mario Pesch
2670561a87 remove docs feature 2022-07-05 21:24:21 +02:00
Mario Pesch
ef72dc8033
Merge pull request #173 from sensebox/fix/missing-senseboxIO
fix missing senseBoxIO Lib in LED Category
2022-05-03 14:40:00 +02:00
Mario Pesch
28114b9a20 fix missing senseBoxIO Lib in LED Category 2022-05-03 10:03:42 +02:00
Mario Pesch
16c463508f
Merge pull request #169 from sensebox/fix/sds-queryMode
change sds from active to query mode
2022-04-28 11:20:54 +02:00
Mario Pesch
8f0c61fe38 change sds from active to query mode 2022-04-28 10:52:04 +02:00
Mario Pesch
198782d106
Merge pull request #168 from sensebox/fix/phyphox-view-style
fix phyphox view style to use lines as default
2022-04-26 10:32:49 +02:00
Mario Pesch
43aa53fb84 fix phyphox view style to use lines as default 2022-04-26 10:28:52 +02:00
Mario Pesch
31efce44e7
Merge pull request #166 from sensebox/fix/code-fixes
Fix/code fixes
2022-04-18 18:40:19 +02:00
Mario Pesch
526e65afe0 return ip 2022-04-18 18:04:05 +02:00
Mario Pesch
1c43a403d6 fix include adafruit mqtt 2022-04-18 11:20:03 +02:00
Mario Pesch
f1e9a5cc78
Merge pull request #162 from sensebox/dependabot/npm_and_yarn/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6
2022-04-10 15:03:11 +02:00
Mario Pesch
5472b4fc0b remove button as switch
closes #165
2022-04-10 14:52:25 +02:00
Mario Pesch
43c3961090 change OLED_RESET
change OLED_RESET Pin to -1
closes #164
2022-04-10 14:51:08 +02:00
Mario Pesch
6fd66b3c49 [WIP] improved docs 2022-04-06 10:49:37 +02:00
Mario Pesch
652de5a184 fix sidebar 2022-04-05 19:27:40 +02:00
Mario Pesch
7bd85a4dc2
Merge branch 'development' into update/tutorial-builder 2022-04-05 19:23:39 +02:00
dependabot[bot]
a4a1b9da75
Bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-01 20:27:51 +00:00
Mario Pesch
d8b0cad74c
Merge pull request #160 from sensebox/fix/bmp-adress
fix bmp i2c adress
2022-03-22 14:09:24 +01:00
Mario Pesch
aa7d81b742 fix bmp i2c adress 2022-03-22 13:39:28 +01:00
Mario Pesch
49e2090b98 update library list 2022-03-18 11:03:15 +01:00
Mario Pesch
669f0c2ade add translations to codeeditor 2022-03-18 10:38:55 +01:00
Mario Pesch
6097a56129 remove examples from sidebar 2022-03-18 10:38:46 +01:00
Felix Erdmann
0608e2efaa
Update .env 2022-03-07 12:05:57 +01:00
Mario Pesch
146d278912 change compiler url 2022-03-04 18:16:24 +01:00
Mario Pesch
de9ec5b0a4 update text 2022-03-04 17:04:49 +01:00
Mario Pesch
0e825c610b change compiler url 2022-03-04 17:00:55 +01:00
Mario Pesch
77c8080c27
Update README.md 2022-03-03 20:09:58 +01:00
Mario Pesch
45b90bfe58 get osem codes if logged in 2022-03-03 10:40:32 +01:00
Mario Pesch
4e8819172b add translations 2022-03-01 15:31:44 +01:00
Mario Pesch
a06b52a3ee add remark plugins to assessment 2022-03-01 15:01:00 +01:00
Mario Pesch
8823c09d3f resolve some warnings 2022-03-01 14:56:08 +01:00
Mario Pesch
d62a27c2cc fix prop type for sound selector 2022-03-01 11:33:43 +01:00
Mario Pesch
ab1a46ab0e replace fade with alpha 2022-03-01 10:25:56 +01:00
Mario Pesch
0414d2043d update tutorial builder
- update tutorial modell
- add difficulty closes #82
- add review system
- make tutorials private by default
- add admin overview
2022-02-28 19:56:19 +01:00
Mario Pesch
cbb58e1341
Merge pull request #155 from sensebox/dependabot/npm_and_yarn/url-parse-1.5.10
Bump url-parse from 1.5.6 to 1.5.10
2022-02-28 10:15:23 +01:00
Mario Pesch
265befd1eb
Merge pull request #154 from sensebox/dependabot/npm_and_yarn/prismjs-1.27.0
Bump prismjs from 1.25.0 to 1.27.0
2022-02-28 10:15:09 +01:00
dependabot[bot]
1c6572bcf8
Bump url-parse from 1.5.6 to 1.5.10
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.6 to 1.5.10.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.6...1.5.10)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-28 03:53:57 +00:00
dependabot[bot]
a0ca85fd4e
Bump prismjs from 1.25.0 to 1.27.0
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.25.0 to 1.27.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.25.0...v1.27.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-26 02:36:11 +00:00
Mario Pesch
39c8fd504f update markdown editor and renderer 2022-02-22 11:18:51 +01:00
Mario Pesch
115e4acc6c fix imageList 2022-02-21 12:26:04 +01:00
Mario Pesch
8fd9eb01ed
Merge pull request #153 from sensebox/markdown_file_upload
file upload with multer
2022-02-18 12:21:00 +01:00
Mario Pesch
8620a452a3 resolve warnings 2022-02-18 12:20:22 +01:00
Mario Pesch
a34e0bbb5d fix double ReactMarkdown import 2022-02-18 11:33:07 +01:00
Mario Pesch
b0ab03d95b
Merge branch 'development' into markdown_file_upload 2022-02-18 11:26:58 +01:00
Mario Pesch
27c934ae88 update packages 2022-02-18 11:21:14 +01:00
fbruc03
3a8f0c38f6 add markdown 2022-02-18 11:12:55 +01:00
fbruc03
f3f6819f05 bring plugins back 2022-02-18 10:56:42 +01:00
Mario Pesch
68f4fbf961
Merge pull request #152 from sensebox/fix-output-types
fix output types
2022-02-18 10:20:04 +01:00
Mario Pesch
da3f909312 fix output types 2022-02-18 10:16:08 +01:00
fbruc03
c908aa5b63 file upload with multer 2022-02-17 18:33:31 +01:00
Mario Pesch
a2200e565a resolve issues 2022-02-17 11:44:50 +01:00
Mario Pesch
2609e56953 Merge branch 'master' into development 2022-02-17 11:15:24 +01:00
Mario Pesch
34f16ee4cf
Merge pull request #151 from sensebox/dependabot/npm_and_yarn/nanoid-3.3.1
Bump nanoid from 3.1.30 to 3.3.1
2022-02-17 10:56:25 +01:00
dependabot[bot]
edfbbb667a
Bump nanoid from 3.1.30 to 3.3.1
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.30 to 3.3.1.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.30...3.3.1)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-17 09:35:08 +00:00
Mario Pesch
72a88e4a1c
Merge pull request #132 from sensebox/remove-senseboxmcu-lib
Remove senseboxmcu lib
2022-02-17 10:34:04 +01:00
Mario Pesch
f9d90f4375 add some help urls and tooltip 📚 2022-02-17 09:57:42 +01:00
Mario Pesch
059f4534ec sensors blocks compile fine now 💻 2022-02-17 09:25:37 +01:00
Mario Pesch
772797bb6b add restart to osem block 2022-02-16 20:01:22 +01:00
Mario Pesch
321cba25ba add ttn mapper decoder
closes #60
2022-02-16 16:11:07 +01:00
Mario Pesch
d3ca85d2e4 fix ssl problems 🚒 2022-02-16 16:06:59 +01:00
Mario Pesch
c525127a9b Merge branch 'master' into remove-senseboxmcu-lib 2022-02-16 10:44:30 +01:00
Mario Pesch
058b5fb680 add librarymanager urls 2022-02-16 10:36:29 +01:00
Mario Pesch
1d8e33d189 remove stuff 2022-02-16 09:56:35 +01:00
Mario Pesch
690ad36d42
Merge pull request #150 from sensebox/dependabot/npm_and_yarn/ws-6.2.2
Bump ws from 6.2.1 to 6.2.2
2022-02-14 10:59:29 +01:00
dependabot[bot]
4b20035323
Bump ws from 6.2.1 to 6.2.2
Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.1...6.2.2)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 09:55:15 +00:00
Mario Pesch
034ce26297
Merge pull request #149 from sensebox/dependabot/npm_and_yarn/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7
2022-02-14 10:54:14 +01:00
Mario Pesch
e11399f941
Merge pull request #148 from sensebox/dependabot/npm_and_yarn/url-parse-1.5.6
Bump url-parse from 1.5.1 to 1.5.6
2022-02-14 10:54:03 +01:00
dependabot[bot]
510dbd91cb
Bump path-parse from 1.0.6 to 1.0.7
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 09:16:56 +00:00
dependabot[bot]
d1fe65ff02
Bump url-parse from 1.5.1 to 1.5.6
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.6.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.6)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 09:16:41 +00:00
Mario Pesch
45ff2e87de
Merge pull request #147 from sensebox/dependabot/npm_and_yarn/tar-6.1.11
Bump tar from 6.1.0 to 6.1.11
2022-02-14 10:14:13 +01:00
Mario Pesch
0f36714e72
Merge pull request #146 from sensebox/dependabot/npm_and_yarn/tmpl-1.0.5
Bump tmpl from 1.0.4 to 1.0.5
2022-02-14 10:13:53 +01:00
dependabot[bot]
385dfd1efa
Bump tar from 6.1.0 to 6.1.11
Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.11.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 08:59:51 +00:00
dependabot[bot]
16657cc777
Bump tmpl from 1.0.4 to 1.0.5
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 08:59:50 +00:00
Mario Pesch
dc8f8ef89a
Merge pull request #145 from sensebox/dependabot/npm_and_yarn/follow-redirects-1.14.8
Bump follow-redirects from 1.14.4 to 1.14.8
2022-02-14 09:58:41 +01:00
dependabot[bot]
52483dd2d4
Bump follow-redirects from 1.14.4 to 1.14.8
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.4 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.4...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-13 20:16:30 +00:00
Mario Pesch
4cece27830 remove interval from maxInstances 2022-02-08 11:03:03 +01:00
Mario Pesch
e44cab49fb add cayenne concentration block 2022-02-07 12:38:58 +01:00
Mario Pesch
514680252b remove telegram for now 2022-02-03 17:15:48 +01:00
Mario Pesch
80811fa573 add multi interval feature
closes #74
2022-02-03 17:09:06 +01:00
Mario Pesch
221c149ea6 fix veml6070 2022-02-03 15:59:48 +01:00
Mario Pesch
c57ca3509b fix wifi code 2022-02-01 11:05:40 +01:00
Mario Pesch
b44d858fe6 cleanup code and update some packages 2022-01-31 19:12:34 +01:00
Mario Pesch
42595be9a4 Update sensebox-sensors.js 2022-01-31 16:57:54 +01:00
Mario Pesch
a5059f9369 fix osem block code generator 2022-01-31 16:07:32 +01:00
Mario Pesch
2cc4d9e84d remove last mcu library includes 2022-01-31 15:58:47 +01:00
Mario Pesch
787d4058fc fixes after merging 2022-01-31 15:56:03 +01:00
Mario Pesch
df9abdc826
Merge pull request #143 from sensebox/block/add-ethernet-bee
Block/add ethernet bee
2022-01-31 15:36:46 +01:00
Mario Pesch
54b4c47303
Merge branch 'remove-senseboxmcu-lib' into block/add-ethernet-bee 2022-01-31 15:33:12 +01:00
Mario Pesch
c711596285 update generated code 2022-01-29 10:50:30 +01:00
Mario Pesch
557d66d7d6
Merge pull request #138 from sensebox/change-tutorial-view
Change tutorial view
2022-01-28 15:34:50 +01:00
Mario Pesch
a0dba75c80
Merge branch 'development' into change-tutorial-view 2022-01-28 15:34:09 +01:00
Mario Pesch
04b15dae0e
Merge pull request #133 from sensebox/feat/codeEditor
Feat/code editor
2022-01-28 15:28:59 +01:00
Mario Pesch
d74e3d29f6 cleanup code 2022-01-28 15:08:41 +01:00
Mario Pesch
9f7ba27d69 add autosave to blocks
closes #58
2022-01-27 19:14:28 +01:00
Mario Pesch
0c8ae90124 add watchdog 2022-01-26 09:52:50 +01:00
Mario Pesch
3e3956b185 add translations 2022-01-25 19:39:23 +01:00
Mario Pesch
405b7fd465 init adding ethernet bee 2022-01-24 14:48:35 +01:00
Mario Pesch
a10e394742 add backpack 2022-01-20 10:31:02 +01:00
Mario Pesch
6f9e4bd79f add DPS310 Sensor
closes #137
2022-01-19 11:39:58 +01:00
Mario Pesch
d4ad3ad915 fix bmp switch case 2022-01-17 16:01:22 +01:00
Mario Pesch
9b5059b7ce change to test compiler 2022-01-17 15:51:44 +01:00
Mario Pesch
1519a7f58b
Merge pull request #136 from sensebox/fix-negative-gps-values
Fix negative gps values
2022-01-14 08:13:12 +01:00
Mario Pesch
748c29c260 auto Save Blocks 2022-01-14 08:12:20 +01:00
Mario Pesch
62b728cf49 fix #135 2022-01-13 11:26:12 +01:00
Mario Pesch
d34c5714e7 fix problem with negativ lat/lng 2022-01-13 11:25:59 +01:00
Mario Pesch
f388828c88 improve code reset 2022-01-10 12:21:16 +01:00
Mario Pesch
8616a7d732 get examples from api 2022-01-08 16:43:59 +01:00
Mario Pesch
6af54573d7 Merge branch 'feat/codeEditor' of https://github.com/sensebox/React-Ardublockly into feat/codeEditor 2022-01-06 12:53:11 +01:00
Mario Pesch
0943742b78 add resetCode 2022-01-06 12:53:08 +01:00
Mario Pesch
3d9a76231b
Merge pull request #134 from sensebox/feat/loading-save-icon
Feat/loading-save-icon
2022-01-06 12:52:40 +01:00
Felix Erdmann
798bf8ca44 add custom loading save icon 2022-01-06 11:48:25 +00:00
Mario Pesch
d682accdbf add autosave and serialmonitor 2022-01-06 10:20:35 +01:00
Mario Pesch
19849d68ab add a new code Editor 2022-01-05 16:24:20 +01:00
Mario Pesch
a1dad8205b change tutorial and assessment view 2021-12-21 12:13:31 +01:00
Mario Pesch
85dc4d7fc9 update blockly version 2021-12-21 12:13:13 +01:00
Mario Pesch
e4fdb542bf Merge branch 'remove-senseboxmcu-lib' of https://github.com/sensebox/React-Ardublockly into remove-senseboxmcu-lib 2021-12-21 09:32:19 +01:00
Mario Pesch
f38e21a94b update blocks and code 2021-12-21 09:31:48 +01:00
Mario Pesch
6a6f0c0304 small fixes 2021-12-21 08:25:16 +01:00
Mario Pesch
94aba6d176
Merge pull request #131 from sensebox/add-sound-selector
add sound selector
2021-12-20 15:16:47 +01:00
Mario Pesch
6fe4c3aab3 update code generators 2021-12-15 10:08:31 +01:00
Mario Pesch
258f0f0841 add sound selector 2021-12-13 15:35:25 +01:00
Mario Pesch
59a226f22e fix loading of blocks with dynamic extra fields 2021-12-09 10:44:38 +01:00
Mario Pesch
9487a490e0 update code generation to replace mcu library 2021-12-09 09:52:41 +01:00
Mario Pesch
279defa7f9 Update sensebox-osem.js 2021-11-30 10:30:49 +01:00
Mario Pesch
13ce43072d
Merge pull request #129 from sensebox/fix/rtc-code-generation
fix rtc generation
2021-11-29 09:46:52 +01:00
Mario Pesch
b2b03b8a1b fix rtc generation 2021-11-29 09:42:42 +01:00
Mario Pesch
3e617deaa8
Merge pull request #128 from sensebox/quick-fix
quick fix
2021-11-26 19:21:35 +01:00
Mario Pesch
36b1fc06d9 quick fix 2021-11-26 18:16:58 +00:00
Mario Pesch
a26f2a2f89
Merge pull request #127 from sensebox/development
Development
2021-11-25 13:53:49 +01:00
Mario Pesch
d21847454a replace more senseBox MCU includes 2021-11-24 18:33:35 +01:00
Mario Pesch
8acc89b99e start replacing mcu lib 2021-11-24 13:08:42 +01:00
Mario Pesch
1ac11ea796 fix issue 2021-11-23 12:00:53 +01:00
Mario Pesch
181df84d2c
Merge pull request #118 from sensebox/feat/senseBoxConnect
init senseBox connect features
2021-11-23 11:56:11 +01:00
Mario Pesch
d167d883b1
Merge branch 'development' into feat/senseBoxConnect 2021-11-23 11:55:15 +01:00
Mario Pesch
56c39e9a9d add translations and maxInstances
fixes #126
fixes #125
2021-11-23 11:48:02 +01:00
Mario Pesch
3c62635332 Create CITATION.cff 2021-11-23 11:47:36 +01:00
Mario Pesch
bc89b40815
Merge pull request #124 from sensebox/fix-mobile-sd
add linebreak
2021-11-16 14:51:01 +01:00
Mario Pesch
82220687ab add linebreak 2021-11-16 14:45:12 +01:00
Mario Pesch
faaabf907b update code generator 2021-11-03 12:31:30 +01:00
Mario Pesch
d67cb74401 add translations and informations 2021-11-03 12:22:51 +01:00
Mario Pesch
0e33361ee8 added a new comment 2021-10-27 15:27:27 +02:00
Mario Pesch
c47cb0a02e
Merge pull request #119 from sensebox/random-small-fixes
Multiple Issue fixes
2021-10-18 10:43:19 +02:00
Mario Pesch
a23f504eec
Merge pull request #122 from sensebox/update-login-button
Update login Button
2021-10-17 17:51:26 +02:00
Mario Pesch
9da3d9041d Update login Button 2021-10-17 17:46:54 +02:00
Mario Pesch
69f2277c6c fixes #113 2021-10-14 13:38:48 +02:00
Mario Pesch
1b4a4225de add ble-bee image 2021-10-14 11:34:21 +02:00
Mario Pesch
bcfe15f4cf update Pin labels
fixes #115
2021-10-14 10:29:20 +02:00
Mario Pesch
b18b56ab68 fix #114 2021-10-13 09:57:09 +02:00
Mario Pesch
c60d2ddba6 add ota settings 2021-10-07 11:11:14 +02:00
Matthias Pfeil
508591f685
Adjust link with correct filename 2021-10-06 10:33:04 +02:00
Mario Pesch
5a07197290
Merge pull request #117 from sensebox/fix/login-not-working
update axios
2021-10-03 18:08:53 +02:00
Mario Pesch
eb4cfa9c24 update axios
Fixes #116
2021-10-03 18:04:46 +02:00
Mario Pesch
faabd9e693 init senseBox connect features 2021-10-01 15:06:22 +02:00
Mario Pesch
e528a78e77
Merge pull request #111 from sensebox/dependabot/npm_and_yarn/axios-0.21.2
Bump axios from 0.21.1 to 0.21.2
2021-09-21 11:45:54 +02:00
dependabot[bot]
26abf81a9d
Bump axios from 0.21.1 to 0.21.2
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-21 09:44:57 +00:00
Mario Pesch
3e3237d338
Merge pull request #110 from sensebox/dependabot/npm_and_yarn/prismjs-1.25.0
Bump prismjs from 1.24.0 to 1.25.0
2021-09-21 11:43:51 +02:00
dependabot[bot]
1e7d7c9fec
Bump prismjs from 1.24.0 to 1.25.0
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.24.0 to 1.25.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.24.0...v1.25.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-20 22:07:03 +00:00
Mario Pesch
5ad1fcd526
Merge pull request #109 from sensebox/fix/rename-variableDB
rename variableDB to nameDB
2021-09-17 12:46:30 +02:00
Mario Pesch
a8cf038821 rename variableDB to nameDB
rename variableDB_ to nameDB_ as it is deprecated
2021-09-17 12:26:18 +02:00
Mario Pesch
abfa5d0bed
Merge pull request #108 from sensebox/improve-sd-blocks
Improve sd blocks
2021-09-17 11:18:04 +02:00
Mario Pesch
6fc640159b add missing translations and update toolbox 2021-09-17 11:00:09 +02:00
Mario Pesch
f6eeed7d75
Merge pull request #101 from sensebox/fix/gps-code
update gps code
2021-09-17 10:49:06 +02:00
Mario Pesch
f20766d489 fix #83 2021-09-17 10:23:05 +02:00
Mario Pesch
5e21a28eb2 rearrange toolbox 2021-09-16 16:32:23 +02:00
Mario Pesch
d54ed3254c add linebreak 2021-09-16 16:29:03 +02:00
Mario Pesch
df739320d2
Merge pull request #107 from sensebox/add-new-components
add new components
2021-09-16 15:56:10 +02:00
Mario Pesch
bd0748f882 add new components 2021-09-16 15:49:29 +02:00
Mario Pesch
e79319c86a add mobile measurments 2021-09-16 13:23:46 +02:00
Mario Pesch
26fd899156 add GPS speed 2021-09-15 20:09:48 +02:00
Mario Pesch
0e0dbed77a update gps code
make gps blocks to osem block compatible
2021-09-10 09:53:35 +02:00
209 changed files with 13098 additions and 65063 deletions

2
.env
View File

@ -2,5 +2,7 @@ REACT_APP_COMPILER_URL=https://compiler.sensebox.de
REACT_APP_BOARD=sensebox-mcu REACT_APP_BOARD=sensebox-mcu
REACT_APP_BLOCKLY_API=https://api.blockly.sensebox.de REACT_APP_BLOCKLY_API=https://api.blockly.sensebox.de
GENERATE_SOURCEMAP=false
# in days # in days
REACT_APP_SHARE_LINK_EXPIRES=30 REACT_APP_SHARE_LINK_EXPIRES=30

View File

@ -0,0 +1,41 @@
name: Build and push image
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
#defaults:
# run:
# working-directory: /repo
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0 # all history for all branches and tags
- name: Login to gitea.simonzeyer.de Repo
uses: docker/login-action@v2
with:
registry: gitea.simonzeyer.de
username: ${{ secrets.DOCKER_REPO_USER }}
password: ${{ secrets.DOCKER_REPO_PASSWD }}
- name: Get Meta
id: meta
run: |
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT
echo REPO_VERSION=$(git describe --always | sed 's/^v//') >> $GITHUB_OUTPUT
- name: Build and push
uses: docker/build-push-action@v4
env:
ACTIONS_RUNTIME_TOKEN: '' # See https://gitea.com/gitea/act_runner/issues/119
with:
context: .
file: ./Dockerfile
push: true
tags: |
gitea.simonzeyer.de/schuelerlabor-cleverlab/smarti:${{ steps.meta.outputs.REPO_VERSION }}

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

14
.github/ISSUE_TEMPLATE/short-issue.md vendored Normal file
View File

@ -0,0 +1,14 @@
---
name: Short Issue
about: Template for Short Issues
title: ''
labels: ''
assignees: ''
---
### Current behaviour
Describe the current behaviour
### Expected behaviour
Describe how it is supposed to work

2
.gitignore vendored
View File

@ -22,4 +22,4 @@ npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
package-lock.json package-lock.json
package-lock.json

26
CITATION.cff Normal file
View File

@ -0,0 +1,26 @@
# This CITATION.cff file was generated with cffinit.
# Visit https://bit.ly/cffinit to generate yours today!
cff-version: 1.2.0
title: senseBox Learn- and Programming Environment
message: Please cite this software using these metadata.
type: software
version: 1.0.0
date-released: 2021-09-30
url: "https://github.com/sensebox/React-Ardublockly"
authors:
- given-names: Mario
family-names: Pesch
email: mario.pesch@uni-muenster.de
affiliation: >-
Institute for geoinformatics University of
Muenster
- given-names: Luc
family-names: Niski
affiliation: >-
Institute for geoinformatics University of
Muenster
- given-names: Felix
family-names: Erdmann
email: f.erdmann@reedu.de
affiliation: Reedu GmbH & Co. KG

12
Dockerfile Normal file
View File

@ -0,0 +1,12 @@
# specify the node base image with your desired version node:<version>
FROM node:16 as build
WORKDIR /app
copy ./ /app
RUN npm install --verbose
RUN npm run build --verbose
FROM nginx:alpine
COPY --from=build /app/build/ /usr/share/nginx/html
RUN chmod 755 /usr/share/nginx/html/ -R
EXPOSE 80
ENTRYPOINT ["sh", "-c", "cd /usr/share/nginx/html/ && nginx -g 'daemon off;'"]

View File

@ -22,7 +22,4 @@ This project was created with [Create React App](https://github.com/facebook/cre
Ensure that line 14 in [store.js](https://github.com/sensebox/React-Ardublockly/blob/master/src/store.js#L14) is commented out or otherwise you have installed [Redux DevTools Extension](http://extension.remotedev.io/). Ensure that line 14 in [store.js](https://github.com/sensebox/React-Ardublockly/blob/master/src/store.js#L14) is commented out or otherwise you have installed [Redux DevTools Extension](http://extension.remotedev.io/).
## Demo ## Demo
A demo of the current status of the master branch can be accessed via [sensebox-ardublockly.netlify.app](https://sensebox-ardublockly.netlify.app/) :rocket:. A demo of the current status of the master branch can be accessed via [https://blockly-react.netlify.app/](https://blockly-react.netlify.app/) :rocket:.
* [Home](https://sensebox-ardublockly.netlify.app/)
* [Tutorial Overview](https://sensebox-ardublockly.netlify.app/tutorial)
* [Tutorial-Builder](https://sensebox-ardublockly.netlify.app/tutorial/builder)

11
docker-compose.yaml Normal file
View File

@ -0,0 +1,11 @@
# docker-compose.yml
services:
smarti:
mem_limit: 2048m
mem_reservation: 128M
cpus: 2
build:
dockerfile: Dockerfile
ports:
- "80"

45714
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +1,63 @@
{ {
"name": "blockly-react", "name": "blockly-react",
"version": "0.1.0", "version": "1.0.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@blockly/block-plus-minus": "^2.0.10", "@blockly/block-plus-minus": "^4.0.4",
"@blockly/field-slider": "^2.1.1", "@blockly/field-grid-dropdown": "^2.0.4",
"@blockly/plugin-scroll-options": "^1.0.2", "@blockly/field-slider": "4.0.4",
"@blockly/plugin-typed-variable-modal": "^3.1.26", "@blockly/plugin-scroll-options": "^3.0.5",
"@blockly/zoom-to-fit": "^2.0.7", "@blockly/plugin-typed-variable-modal": "^5.0.6",
"@fortawesome/fontawesome-svg-core": "^1.2.30", "@blockly/workspace-backpack": "^3.0.4",
"@fortawesome/free-solid-svg-icons": "^5.14.0", "@blockly/zoom-to-fit": "^3.0.4",
"@fortawesome/react-fontawesome": "^0.1.11", "@emotion/react": "^11.10.5",
"@material-ui/core": "^4.11.0", "@emotion/styled": "^11.10.5",
"@sentry/react": "^6.0.0", "@fortawesome/fontawesome-svg-core": "^6.2.1",
"@sentry/tracing": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.2.1",
"@testing-library/jest-dom": "^4.2.4", "@fortawesome/react-fontawesome": "^0.2.0",
"@testing-library/react": "^9.5.0", "@monaco-editor/react": "^4.3.1",
"@mui/lab": "^5.0.0-alpha.110",
"@mui/material": "^5.10.16",
"@mui/styles": "^5.10.16",
"@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^7.2.1", "@testing-library/user-event": "^7.2.1",
"axios": "^0.21.0", "axios": "^0.22.0",
"blockly": "^6.20210701.0", "blockly": "^9.2.0",
"file-saver": "^2.0.2", "file-saver": "^2.0.5",
"markdown-it": "^12.3.2",
"mnemonic-id": "^3.2.7", "mnemonic-id": "^3.2.7",
"moment": "^2.28.0", "moment": "^2.29.4",
"prismjs": "^1.24.0", "prismjs": "^1.27.0",
"qrcode.react": "^3.1.0",
"react": "^17.0.2", "react": "^17.0.2",
"react-cookie-consent": "^5.2.0", "react-cookie-consent": "^7.2.1",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-markdown": "^5.0.2", "react-markdown": "^8.0.0",
"react-markdown-editor-lite": "^1.3.3",
"react-mde": "^11.5.0", "react-mde": "^11.5.0",
"react-redux": "^7.2.4", "react-rating-stars-component": "^2.2.0",
"react-router-dom": "^5.2.0", "react-redux": "^7.2.9",
"react-scripts": "^4.0.3", "react-router-dom": "^5.3.3",
"reactour": "^1.18.0", "react-scripts": "^5.0.1",
"redux": "^4.0.5", "react-share": "^4.4.0",
"redux-thunk": "^2.3.0", "react-spinners": "^0.13.3",
"rich-markdown-editor": "^11.17.7", "reactour": "^1.18.7",
"styled-components": "^5.0.0", "redux": "^4.2.0",
"uuid": "^8.3.1" "redux-thunk": "^2.4.1",
"rehype-raw": "^6.1.1",
"remark-gemoji": "^7.0.1",
"remark-gfm": "^3.0.1",
"styled-components": "^4.4.1",
"uuid": "^8.3.1",
"watchpack": "^2.3.1"
},
"resolutions": {
"//": "See https://github.com/facebook/create-react-app/issues/11773",
"react-error-overlay": "6.0.9"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "node_modules/react-scripts/bin/react-scripts.js start",
"dev": "set \"REACT_APP_BLOCKLY_API=http://localhost:8080\" && npm start", "dev": "set \"REACT_APP_BLOCKLY_API=http://localhost:8080\" && npm start",
"build": "react-scripts build", "build": "react-scripts build",
"test": "react-scripts test", "test": "react-scripts test",
@ -48,16 +66,12 @@
"eslintConfig": { "eslintConfig": {
"extends": "react-app" "extends": "react-app"
}, },
"browserslist": { "browserslist": [
"production": [ ">0.2%",
">0.2%", "not dead",
"not dead", "not op_mini all"
"not op_mini all" ],
], "devDependencies": {
"development": [ "@babel/plugin-proposal-private-property-in-object": "7.21.11"
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

View File

@ -1,51 +1,74 @@
.wrapper { .wrapper {
min-height: calc(100vh - 60px); /* will cover the 100% of viewport - height of footer (padding-bottom) */ min-height: calc(
100vh - 60px
); /* will cover the 100% of viewport - height of footer (padding-bottom) */
overflow: hidden; overflow: hidden;
display: block; display: block;
position: relative; position: relative;
padding-bottom: 60px; /* height of your footer + 30px*/ padding-bottom: 60px; /* height of your footer + 30px*/
} }
.tutorial img {
.tutorial img{
display: flex; display: flex;
align-items: center; align-items: center;
max-height: 40vH; max-height: 40vh;
max-width: 100%; max-width: 100%;
margin: auto; margin: auto;
}
.news img{
display: flex;
align-items: center;
max-height: 40vH;
max-width: 100%;
margin: auto;
}
.tutorial blockquote{
background: #f9f9f9;
border-left: 10px solid#4EAF47;
margin: 1.5em 10px;
padding: 0.5em 10px;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote:before {
color:#4EAF47;
content: open-quote;
font-size: 4em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
}
blockquote p {
display: inline;
}
.overlay {
display: flex;
flex-direction: column;
align-items: center;
} }
.news img {
display: flex;
align-items: center;
max-height: 40vh;
max-width: 100%;
margin: auto;
}
.tutorial blockquote {
background: #f9f9f9;
border-left: 10px solid#4EAF47;
margin: 1.5em 10px;
padding: 0.5em 10px;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote:before {
color: #4eaf47;
content: open-quote;
font-size: 4em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
}
blockquote p {
display: inline;
}
.tutorial table,
th,
td {
border: 1px solid #ddd;
}
.tutorial th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
border-color: #4eaf47;
color: white;
}
.overlay {
display: flex;
flex-direction: column;
align-items: center;
}
:root {
--url: url('./data/mcu_opacity.png');
}
.blocklySvg {
background-image: var(--url);
background-position: center;
background-repeat: no-repeat;
}

View File

@ -1,35 +1,34 @@
import React, { Component } from 'react'; import React, { Component } from "react";
import { BrowserRouter as Router } from 'react-router-dom'; import { Router } from "react-router-dom";
import { createBrowserHistory } from "history"; import { createBrowserHistory } from "history";
import { Provider } from 'react-redux'; import { Provider } from "react-redux";
import store from './store'; import store from "./store";
import { loadUser } from './actions/authActions'; import { loadUser } from "./actions/authActions";
import './App.css'; import "./App.css";
import { ThemeProvider, createMuiTheme } from '@material-ui/core/styles'; import { ThemeProvider, StyledEngineProvider, createTheme } from "@mui/material/styles";
import Content from './components/Content'; import Content from "./components/Content";
const theme = createMuiTheme({ const theme = createTheme({
palette: { palette: {
primary: { primary: {
main: '#4EAF47', main: "#4EAF47",
contrastText: '#ffffff' contrastText: "#ffffff",
}, },
secondary: { secondary: {
main: '#DDDDDD' main: "#DDDDDD",
}, },
button: { button: {
compile: '#e27136' compile: "#e27136",
} },
} },
}); });
class App extends Component { class App extends Component {
componentDidMount() { componentDidMount() {
store.dispatch(loadUser()); store.dispatch(loadUser());
} }
@ -37,13 +36,15 @@ class App extends Component {
render() { render() {
const customHistory = createBrowserHistory(); const customHistory = createBrowserHistory();
return ( return (
<ThemeProvider theme={theme}> <StyledEngineProvider injectFirst>
<Provider store={store}> <ThemeProvider theme={theme}>
<Router history={customHistory}> <Provider store={store}>
<Content /> <Router history={customHistory}>
</Router> <Content />
</Provider> </Router>
</ThemeProvider> </Provider>
</ThemeProvider>
</StyledEngineProvider>
); );
} }
} }

View File

@ -63,63 +63,56 @@ export const loadUser = () => (dispatch) => {
}); });
}; };
var logoutTimerId;
const timeToLogout = 14.9 * 60 * 1000; // nearly 15 minutes corresponding to the API
// Login user // Login user
export const login = export const login =
({ email, password }) => ({ email, password }) =>
(dispatch) => { (dispatch) => {
dispatch({ dispatch({
type: USER_LOADING, type: USER_LOADING,
});
// Headers
const config = {
headers: {
"Content-Type": "application/json",
},
};
// Request Body
const body = JSON.stringify({ email, password });
axios
.post(`${process.env.REACT_APP_BLOCKLY_API}/user`, body, config)
.then((res) => {
// Logout automatically if refreshToken "expired"
const logoutTimer = () =>
setTimeout(() => dispatch(logout()), timeToLogout);
logoutTimerId = logoutTimer();
dispatch(setLanguage(res.data.user.language));
dispatch({
type: LOGIN_SUCCESS,
payload: res.data,
});
dispatch({
type: GET_STATUS,
payload: res.data.user.status,
});
dispatch(returnSuccess(res.data.message, res.status, "LOGIN_SUCCESS"));
})
.catch((err) => {
dispatch(
returnErrors(
err.response.data.message,
err.response.status,
"LOGIN_FAIL"
)
);
dispatch({
type: LOGIN_FAIL,
});
var status = [];
if (window.localStorage.getItem("status")) {
status = JSON.parse(window.localStorage.getItem("status"));
}
dispatch({
type: GET_STATUS,
payload: status,
});
}); });
}; // Headers
const config = {
headers: {
"Content-Type": "application/json",
},
};
// Request Body
const body = JSON.stringify({ email, password });
axios
.post(`${process.env.REACT_APP_BLOCKLY_API}/user`, body, config)
.then((res) => {
dispatch(setLanguage(res.data.user.language));
dispatch({
type: LOGIN_SUCCESS,
payload: res.data,
});
dispatch({
type: GET_STATUS,
payload: res.data.user.status,
});
dispatch(returnSuccess(res.data.message, res.status, "LOGIN_SUCCESS"));
})
.catch((err) => {
dispatch(
returnErrors(
err.response.data.message,
err.response.status,
"LOGIN_FAIL"
)
);
dispatch({
type: LOGIN_FAIL,
});
var status = [];
if (window.localStorage.getItem("status")) {
status = JSON.parse(window.localStorage.getItem("status"));
}
dispatch({
type: GET_STATUS,
payload: status,
});
});
};
// Logout User // Logout User
export const logout = () => (dispatch) => { export const logout = () => (dispatch) => {
@ -144,7 +137,6 @@ export const logout = () => (dispatch) => {
} }
dispatch(setLanguage(locale)); dispatch(setLanguage(locale));
dispatch(returnSuccess(res.data.message, res.status, "LOGOUT_SUCCESS")); dispatch(returnSuccess(res.data.message, res.status, "LOGOUT_SUCCESS"));
clearTimeout(logoutTimerId);
}, },
error: (err) => { error: (err) => {
dispatch( dispatch(
@ -165,7 +157,6 @@ export const logout = () => (dispatch) => {
type: GET_STATUS, type: GET_STATUS,
payload: status, payload: status,
}); });
clearTimeout(logoutTimerId);
}, },
}; };
axios axios
@ -222,10 +213,6 @@ export const authInterceptor = () => (dispatch, getState) => {
}) })
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
clearTimeout(logoutTimerId);
const logoutTimer = () =>
setTimeout(() => dispatch(logout()), timeToLogout);
logoutTimerId = logoutTimer();
dispatch({ dispatch({
type: REFRESH_TOKEN_SUCCESS, type: REFRESH_TOKEN_SUCCESS,
payload: res.data, payload: res.data,

View File

@ -0,0 +1,15 @@
import {
BOARD,
} from "./types";
import mini_opacity from "../data/mini_opacity.png"
import mcu_opacity from "../data/mcu_opacity.png"
export const setBoard = (board) => (dispatch) => {
window.sessionStorage.setItem("board", board);
const root = document.querySelector(':root');
root.style.setProperty('--url', `url(${board === "mcu" ? mcu_opacity : mini_opacity})`);
dispatch({
type: BOARD,
payload: board,
});
};

View File

@ -1,32 +1,52 @@
import { VISIT, LANGUAGE, RENDERER, STATISTICS } from './types'; import {
VISIT,
LANGUAGE,
RENDERER,
SOUNDS,
STATISTICS,
PLATFORM,
} from "./types";
export const visitPage = () => (dispatch) => { export const visitPage = () => (dispatch) => {
dispatch({ dispatch({
type: VISIT type: VISIT,
});
};
export const setPlatform = (platform) => (dispatch) => {
dispatch({
type: PLATFORM,
payload: platform,
}); });
}; };
export const setLanguage = (language) => (dispatch, getState) => { export const setLanguage = (language) => (dispatch, getState) => {
if(!getState().auth.progress && !getState().auth.isAuthenticated){ if (!getState().auth.progress && !getState().auth.isAuthenticated) {
window.localStorage.setItem('locale', language); window.localStorage.setItem("locale", language);
} }
dispatch({ dispatch({
type: LANGUAGE, type: LANGUAGE,
payload: language payload: language,
}); });
}; };
export const setRenderer = (renderer) => (dispatch) => { export const setRenderer = (renderer) => (dispatch) => {
dispatch({ dispatch({
type: RENDERER, type: RENDERER,
payload: renderer payload: renderer,
});
};
export const setSounds = (sounds) => (dispatch) => {
dispatch({
type: SOUNDS,
payload: sounds,
}); });
}; };
export const setStatistics = (showStatistics) => (dispatch) => { export const setStatistics = (showStatistics) => (dispatch) => {
dispatch({ dispatch({
type: STATISTICS, type: STATISTICS,
payload: showStatistics payload: showStatistics,
}); });
}; };

View File

@ -0,0 +1,18 @@
import axios from 'axios'
const fetchSensorWikiSuccess = sensors => ({
type: 'FETCH_SENSORWIKI_SUCCESS',
payload: { sensors }
})
export const fetchSensors = () => {
return async dispatch => {
try {
let sensors = await axios.get('https://api.sensors.wiki/sensors/all')
dispatch(fetchSensorWikiSuccess(sensors.data))
}
catch(e){
console.log(e)
}
}
}

View File

@ -84,6 +84,77 @@ export const getTutorials = () => (dispatch, getState) => {
}); });
}; };
export const getAllTutorials = () => (dispatch, getState) => {
axios
.get(`${process.env.REACT_APP_BLOCKLY_API}/tutorial/getAllTutorials`)
.then((res) => {
var tutorials = res.data.tutorials;
existingTutorials(tutorials, getState().tutorial.status).then(
(status) => {
dispatch({
type: TUTORIAL_SUCCESS,
payload: status,
});
dispatch(updateStatus(status));
dispatch({
type: GET_TUTORIALS,
payload: tutorials,
});
dispatch({ type: TUTORIAL_PROGRESS });
dispatch(returnSuccess(res.data.message, res.status));
}
);
})
.catch((err) => {
if (err.response) {
dispatch(
returnErrors(
err.response.data.message,
err.response.status,
"GET_TUTORIALS_FAIL"
)
);
}
dispatch({ type: TUTORIAL_PROGRESS });
});
};
export const getUserTutorials = () => (dispatch, getState) => {
axios
.get(`${process.env.REACT_APP_BLOCKLY_API}/tutorial/getUserTutorials`)
.then((res) => {
var tutorials = res.data.tutorials;
existingTutorials(tutorials, getState().tutorial.status).then(
(status) => {
dispatch({
type: TUTORIAL_SUCCESS,
payload: status,
});
dispatch(updateStatus(status));
dispatch({
type: GET_TUTORIALS,
payload: tutorials,
});
dispatch({ type: TUTORIAL_PROGRESS });
dispatch(returnSuccess(res.data.message, res.status));
}
);
})
.catch((err) => {
console.log(err);
if (err.response) {
dispatch(
returnErrors(
err.response.data.message,
err.response.status,
"GET_TUTORIALS_FAIL"
)
);
}
dispatch({ type: TUTORIAL_PROGRESS });
});
};
export const updateStatus = (status) => (dispatch, getState) => { export const updateStatus = (status) => (dispatch, getState) => {
if (getState().auth.isAuthenticated) { if (getState().auth.isAuthenticated) {
// update user account in database - sync with redux store // update user account in database - sync with redux store

View File

@ -4,6 +4,9 @@ import {
BUILDER_CHANGE, BUILDER_CHANGE,
BUILDER_ERROR, BUILDER_ERROR,
BUILDER_TITLE, BUILDER_TITLE,
BUILDER_PUBLIC,
BUILDER_DIFFICULTY,
BUILDER_REVIEW,
BUILDER_ID, BUILDER_ID,
BUILDER_ADD_STEP, BUILDER_ADD_STEP,
BUILDER_DELETE_STEP, BUILDER_DELETE_STEP,
@ -35,6 +38,30 @@ export const tutorialTitle = (title) => (dispatch) => {
dispatch(changeTutorialBuilder()); dispatch(changeTutorialBuilder());
}; };
export const tutorialPublic = (pub) => (dispatch) => {
dispatch({
type: BUILDER_PUBLIC,
payload: pub,
});
dispatch(changeTutorialBuilder());
};
export const tutorialDifficulty = (difficulty) => (dispatch) => {
dispatch({
type: BUILDER_DIFFICULTY,
payload: difficulty,
});
dispatch(changeTutorialBuilder());
};
export const tutorialReview = (review) => (dispatch) => {
dispatch({
type: BUILDER_REVIEW,
payload: review,
});
dispatch(changeTutorialBuilder());
};
export const tutorialSteps = (steps) => (dispatch) => { export const tutorialSteps = (steps) => (dispatch) => {
dispatch({ dispatch({
type: BUILDER_ADD_STEP, type: BUILDER_ADD_STEP,
@ -320,6 +347,7 @@ export const readJSON = (json) => (dispatch, getState) => {
return object; return object;
}); });
dispatch(tutorialTitle(json.title)); dispatch(tutorialTitle(json.title));
dispatch(tutorialDifficulty(json.difficulty));
dispatch(tutorialSteps(steps)); dispatch(tutorialSteps(steps));
dispatch(setSubmitError()); dispatch(setSubmitError());
dispatch(progress(false)); dispatch(progress(false));

View File

@ -21,6 +21,7 @@ export const NAME = "NAME";
export const TUTORIAL_PROGRESS = "TUTORIAL_PROGRESS"; export const TUTORIAL_PROGRESS = "TUTORIAL_PROGRESS";
export const GET_TUTORIAL = "GET_TUTORIAL"; export const GET_TUTORIAL = "GET_TUTORIAL";
export const GET_TUTORIALS = "GET_TUTORIALS"; export const GET_TUTORIALS = "GET_TUTORIALS";
export const GET_USERTUTORIALS = "GET_USERTUTORIALS";
export const GET_STATUS = "GET_STATUS"; export const GET_STATUS = "GET_STATUS";
export const TUTORIAL_SUCCESS = "TUTORIAL_SUCCESS"; export const TUTORIAL_SUCCESS = "TUTORIAL_SUCCESS";
export const TUTORIAL_ERROR = "TUTORIAL_ERROR"; export const TUTORIAL_ERROR = "TUTORIAL_ERROR";
@ -32,6 +33,9 @@ export const JSON_STRING = "JSON_STRING";
export const BUILDER_CHANGE = "BUILDER_CHANGE"; export const BUILDER_CHANGE = "BUILDER_CHANGE";
export const BUILDER_TITLE = "BUILDER_TITLE"; export const BUILDER_TITLE = "BUILDER_TITLE";
export const BUILDER_DIFFICULTY = "BUILDER_DIFFICULTY";
export const BUILDER_PUBLIC = "BUILDER_PUBLIC";
export const BUILDER_REVIEW = "BUILDER_REVIEW";
export const BUILDER_ID = "BUILDER_ID"; export const BUILDER_ID = "BUILDER_ID";
export const BUILDER_ADD_STEP = "BUILDER_ADD_STEP"; export const BUILDER_ADD_STEP = "BUILDER_ADD_STEP";
export const BUILDER_DELETE_STEP = "BUILDER_DELETE_STEP"; export const BUILDER_DELETE_STEP = "BUILDER_DELETE_STEP";
@ -43,7 +47,9 @@ export const PROGRESS = "PROGRESS";
export const VISIT = "VISIT"; export const VISIT = "VISIT";
export const LANGUAGE = "LANGUAGE"; export const LANGUAGE = "LANGUAGE";
export const PLATFORM = "PLATFORM";
export const RENDERER = "RENDERER"; export const RENDERER = "RENDERER";
export const SOUNDS = "SOUNDS";
export const STATISTICS = "STATISTICS"; export const STATISTICS = "STATISTICS";
// messages // messages
@ -57,3 +63,6 @@ export const GET_PROJECT = "GET_PROJECT";
export const GET_PROJECTS = "GET_PROJECTS"; export const GET_PROJECTS = "GET_PROJECTS";
export const PROJECT_TYPE = "PROJECT_TYPE"; export const PROJECT_TYPE = "PROJECT_TYPE";
export const PROJECT_DESCRIPTION = "PROJECT_DESCRIPTION"; export const PROJECT_DESCRIPTION = "PROJECT_DESCRIPTION";
//board
export const BOARD = "BOARD";

View File

@ -16,13 +16,19 @@ export const onChangeCode = () => (dispatch, getState) => {
code.arduino = Blockly.Arduino.workspaceToCode(workspace); code.arduino = Blockly.Arduino.workspaceToCode(workspace);
var xmlDom = Blockly.Xml.workspaceToDom(workspace); var xmlDom = Blockly.Xml.workspaceToDom(workspace);
code.xml = Blockly.Xml.domToPrettyText(xmlDom); code.xml = Blockly.Xml.domToPrettyText(xmlDom);
var selectedBlock = Blockly.selected var selectedBlock = Blockly.getSelected();
if (selectedBlock !== null) { if (selectedBlock !== null) {
code.helpurl = selectedBlock.helpUrl code.helpurl = selectedBlock.helpUrl
code.tooltip = selectedBlock.tooltip code.tooltip = selectedBlock.tooltip
if (selectedBlock.data) {
code.data = selectedBlock.data
} else {
code.data = null
}
} else if (selectedBlock === null) { } else if (selectedBlock === null) {
code.tooltip = Blockly.Msg.tooltip_hint code.tooltip = Blockly.Msg.tooltip_hint
code.helpurl = '' code.helpurl = ''
code.data = null
} }

View File

@ -1,34 +1,29 @@
import React, { Component } from 'react'; import React, { Component } from "react";
import { withStyles } from '@material-ui/core/styles'; import withStyles from '@mui/styles/withStyles';
import { fade } from '@material-ui/core/styles/colorManipulator'; import { alpha } from "@mui/material/styles";
import Typography from '@material-ui/core/Typography'; import Typography from "@mui/material/Typography";
const styles = (theme) => ({ const styles = (theme) => ({
alert: { alert: {
marginBottom: '20px', marginBottom: "20px",
border: `1px solid ${theme.palette.primary.main}`, border: `1px solid ${theme.palette.primary.main}`,
padding: '10px 20px', padding: "10px 20px",
borderRadius: '4px', borderRadius: "4px",
background: fade(theme.palette.primary.main, 0.3), background: alpha(theme.palette.primary.main, 0.3),
color: 'rgb(70,70,70)' color: "rgb(70,70,70)",
} },
}); });
export class Alert extends Component { export class Alert extends Component {
render() {
render(){ return (
return(
<div className={this.props.classes.alert}> <div className={this.props.classes.alert}>
<Typography> <Typography>{this.props.children}</Typography>
{this.props.children}
</Typography>
</div> </div>
); );
} }
} }
export default withStyles(styles, { withTheme: true })(Alert); export default withStyles(styles, { withTheme: true })(Alert);

View File

@ -27,7 +27,7 @@ import Blockly from "blockly/core";
import "blockly/blocks"; import "blockly/blocks";
import Toolbox from "./toolbox/Toolbox"; import Toolbox from "./toolbox/Toolbox";
import { Card } from "@material-ui/core"; import { Card } from "@mui/material";
import { import {
ScrollOptions, ScrollOptions,
ScrollBlockDragger, ScrollBlockDragger,

View File

@ -11,6 +11,8 @@ import "./blocks/index";
import "./generator/index"; import "./generator/index";
import { ZoomToFitControl } from "@blockly/zoom-to-fit"; import { ZoomToFitControl } from "@blockly/zoom-to-fit";
import { initialXml } from "./initialXml.js"; import { initialXml } from "./initialXml.js";
import { getMaxInstances } from "./helpers/maxInstances";
import { Backpack } from "@blockly/workspace-backpack";
class BlocklyWindow extends Component { class BlocklyWindow extends Component {
constructor(props) { constructor(props) {
@ -24,6 +26,7 @@ class BlocklyWindow extends Component {
this.props.clearStats(); this.props.clearStats();
workspace.addChangeListener((event) => { workspace.addChangeListener((event) => {
this.props.onChangeWorkspace(event); this.props.onChangeWorkspace(event);
// switch on that a block is displayed disabled or not depending on whether it is correctly connected // switch on that a block is displayed disabled or not depending on whether it is correctly connected
// for SVG display, a deactivated block in the display is undesirable // for SVG display, a deactivated block in the display is undesirable
if (this.props.blockDisabled) { if (this.props.blockDisabled) {
@ -33,11 +36,24 @@ class BlocklyWindow extends Component {
Blockly.svgResize(workspace); Blockly.svgResize(workspace);
const zoomToFit = new ZoomToFitControl(workspace); const zoomToFit = new ZoomToFitControl(workspace);
zoomToFit.init(); zoomToFit.init();
// Initialize plugin.
const backpack = new Backpack(workspace);
backpack.init();
} }
componentDidUpdate(props) { componentDidUpdate(props) {
const workspace = Blockly.getMainWorkspace(); const workspace = Blockly.getMainWorkspace();
var xml = this.props.initialXml; var xml = this.props.initialXml;
if (props.selectedBoard !== this.props.selectedBoard) {
xml = localStorage.getItem("autoSaveXML");
// change board
if(!xml) xml = initialXml;
var xmlDom = Blockly.Xml.textToDom(xml);
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);
// var toolbox = workspace.getToolbox();
// workspace.updateToolbox(toolbox.toolboxDef_);
}
// if svg is true, then the update process is done in the BlocklySvg component // if svg is true, then the update process is done in the BlocklySvg component
if (props.initialXml !== xml && !this.props.svg) { if (props.initialXml !== xml && !this.props.svg) {
// guarantees that the current xml-code (this.props.initialXml) is rendered // guarantees that the current xml-code (this.props.initialXml) is rendered
@ -47,8 +63,9 @@ class BlocklyWindow extends Component {
} }
if (props.language !== this.props.language) { if (props.language !== this.props.language) {
// change language // change language
xml = localStorage.getItem("autoSaveXML");
if (!xml) xml = initialXml; if (!xml) xml = initialXml;
var xmlDom = Blockly.Xml.textToDom(xml); xmlDom = Blockly.Xml.textToDom(xml);
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace); Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);
// var toolbox = workspace.getToolbox(); // var toolbox = workspace.getToolbox();
// workspace.updateToolbox(toolbox.toolboxDef_); // workspace.updateToolbox(toolbox.toolboxDef_);
@ -69,6 +86,8 @@ class BlocklyWindow extends Component {
this.props.trashcan !== undefined ? this.props.trashcan : true this.props.trashcan !== undefined ? this.props.trashcan : true
} }
renderer={this.props.renderer} renderer={this.props.renderer}
sounds={this.props.sounds}
maxInstances={getMaxInstances()}
zoom={{ zoom={{
// https://developers.google.com/blockly/guides/configure/web/zoom // https://developers.google.com/blockly/guides/configure/web/zoom
controls: controls:
@ -119,12 +138,16 @@ BlocklyWindow.propTypes = {
onChangeWorkspace: PropTypes.func.isRequired, onChangeWorkspace: PropTypes.func.isRequired,
clearStats: PropTypes.func.isRequired, clearStats: PropTypes.func.isRequired,
renderer: PropTypes.string.isRequired, renderer: PropTypes.string.isRequired,
sounds: PropTypes.bool.isRequired,
language: PropTypes.string.isRequired, language: PropTypes.string.isRequired,
selectedBoard: PropTypes.string.isRequired,
}; };
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
renderer: state.general.renderer, renderer: state.general.renderer,
sounds: state.general.sounds,
language: state.general.language, language: state.general.language,
selectedBoard: state.board.board,
}); });
export default connect(mapStateToProps, { onChangeWorkspace, clearStats })( export default connect(mapStateToProps, { onChangeWorkspace, clearStats })(

View File

@ -0,0 +1,88 @@
import Blockly from "blockly";
import { getColour } from "../helpers/colour";
import * as Types from "../helpers/types";
import { selectedBoard } from "../helpers/board";
import { FieldGridDropdown } from "@blockly/field-grid-dropdown";
/**
* DS18B20 Temperatursonde
*
*/
Blockly.Blocks["CleVerLab_dummy1"] = {
init: function () {
this.setColour(getColour().cleverlab);
this.appendDummyInput()
.appendField("tut nichts")
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "empty"};
},
};
Blockly.Blocks["CleVerLab_temperature"] = {
init: function () {
this.setColour(getColour().cleverlab);
this.appendDummyInput()
.appendField("Temperatur")
.appendField("Digital Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "DigitalPin");
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "ds18b20"};
},
};
/**
* PH Wert
*
*/
Blockly.Blocks["CleVerLab_pH"] = {
init: function () {
this.setColour(getColour().cleverlab);
this.appendDummyInput()
.appendField("pH Wert")
.appendField("Digital Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "DigitalPin");
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "phoderso"};
},
};
Blockly.Blocks["CleVerLab_cali1"] = {
init: function () {
this.appendDummyInput()
.appendField("Kalibriere pH Sensor");
this.appendValueInput("VAR1", "Number")
.appendField("Referenzlösung pH 4.00 =")
.setAlign(Blockly.ALIGN_RIGHT);
this.appendValueInput("VAR2", "Number2")
.appendField("Referenzlösung pH 7.00 =")
.setAlign(Blockly.ALIGN_RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().cleverlab);
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "dsasda"};
},
};
/**
* Pump
*
*/
Blockly.Blocks['CleVerLab_pump'] = {
init: function() {
this.setColour(getColour().cleverlab);
var dropdown = new Blockly.FieldDropdown([
[ 'START','HIGH'],
[ 'STOPP','LOW']
]);
this.appendDummyInput()
.appendField(dropdown, "Mode")
.appendField(" Pumpe ")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "DigitalPin");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
//this.setOutput(true, "Number");
this.setTooltip('');
this.setHelpUrl('');
}
};

View File

@ -6,9 +6,11 @@ import "./sensebox-telegram";
import "./sensebox-osem"; import "./sensebox-osem";
import "./sensebox-web"; import "./sensebox-web";
import "./sensebox-display"; import "./sensebox-display";
import "./sensebox-motors";
import "./sensebox-lora"; import "./sensebox-lora";
import "./sensebox-led"; import "./sensebox-led";
import "./sensebox-rtc"; import "./sensebox-rtc";
import "./sensebox-ntp";
import "./sensebox-ble"; import "./sensebox-ble";
import "./sensebox-sd"; import "./sensebox-sd";
import "./mqtt"; import "./mqtt";
@ -18,9 +20,12 @@ import "./audio";
import "./math"; import "./math";
import "./map"; import "./map";
import "./procedures"; import "./procedures";
import "./serial";
import "./time"; import "./time";
import "./variables"; import "./variables";
import "./lists"; import "./lists";
import "./watchdog";
import "./webserver"; import "./webserver";
import "./CleVerLab"
import "../helpers/types"; import "../helpers/types";

View File

@ -10,248 +10,271 @@
* *
* TODO: maybe change this to a "PIN" BlocklyType * TODO: maybe change this to a "PIN" BlocklyType
*/ */
import Blockly from 'blockly/core'; import Blockly from "blockly/core";
import { selectedBoard } from '../helpers/board' import { selectedBoard } from "../helpers/board";
import * as Types from '../helpers/types' import * as Types from "../helpers/types";
Blockly.Blocks["io_digitalwrite"] = {
Blockly.Blocks['io_digitalwrite'] = { /**
/** * Block for creating a 'set pin' to a state.
* Block for creating a 'set pin' to a state. * @this Blockly.Block
* @this Blockly.Block */
*/ init: function () {
init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/DigitalWrite");
this.setHelpUrl('http://arduino.cc/en/Reference/DigitalWrite'); this.setColour(250);
this.setColour(250); this.appendValueInput("STATE")
this.appendValueInput('STATE') .appendField(Blockly.Msg.ARD_DIGITALWRITE)
.appendField(Blockly.Msg.ARD_DIGITALWRITE) .appendField(
.appendField(new Blockly.FieldDropdown( new Blockly.FieldDropdown(selectedBoard().digitalPins),
selectedBoard().digitalPins), 'PIN') "PIN"
.appendField(Blockly.Msg.ARD_WRITE_TO) )
.setCheck(Types.BOOLEAN.checkList); .appendField(Blockly.Msg.ARD_WRITE_TO)
this.setInputsInline(false); .setCheck(Types.BOOLEAN.checkList);
this.setPreviousStatement(true, null); this.setInputsInline(false);
this.setNextStatement(true, null); this.setPreviousStatement(true, null);
this.setTooltip(Blockly.Msg.ARD_DIGITALWRITE_TIP); this.setNextStatement(true, null);
}, this.setTooltip(Blockly.Msg.ARD_DIGITALWRITE_TIP);
/** },
* Updates the content of the the pin related fields. /**
* @this Blockly.Block * Updates the content of the the pin related fields.
*/ * @this Blockly.Block
updateFields: function () { */
Blockly.Arduino.Boards.refreshBlockFieldDropdown( updateFields: function () {
this, 'PIN', 'digitalPins'); Blockly.Arduino.Boards.refreshBlockFieldDropdown(
} this,
"PIN",
"digitalPins"
);
},
}; };
Blockly.Blocks['io_digitalread'] = { Blockly.Blocks["io_digitalread"] = {
/** /**
* Block for creating a 'read pin'. * Block for creating a 'read pin'.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/DigitalRead'); this.setHelpUrl("http://arduino.cc/en/Reference/DigitalRead");
this.setColour(250); this.setColour(250);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.ARD_DIGITALREAD) .appendField(Blockly.Msg.ARD_DIGITALREAD)
.appendField(new Blockly.FieldDropdown( .appendField(
selectedBoard().digitalPins), 'PIN'); new Blockly.FieldDropdown(selectedBoard().digitalPins),
this.setOutput(true, 'boolean'); "PIN"
this.setTooltip(Blockly.Msg.ARD_DIGITALREAD_TIP); );
}, this.setOutput(true, "boolean");
/** @return {!string} The type of return value for the block, an integer. */ this.setTooltip(Blockly.Msg.ARD_DIGITALREAD_TIP);
getBlockType: function () { },
return Types.BOOLEAN; /** @return {!string} The type of return value for the block, an integer. */
}, getBlockType: function () {
/** return Types.BOOLEAN;
* Updates the content of the the pin related fields. },
* @this Blockly.Block /**
*/ * Updates the content of the the pin related fields.
updateFields: function () { * @this Blockly.Block
Blockly.Arduino.Boards.refreshBlockFieldDropdown( */
this, 'PIN', 'digitalPins'); updateFields: function () {
} Blockly.Arduino.Boards.refreshBlockFieldDropdown(
this,
"PIN",
"digitalPins"
);
},
}; };
Blockly.Blocks['io_builtin_led'] = { Blockly.Blocks["io_builtin_led"] = {
/** /**
* Block for setting built-in LED to a state. * Block for setting built-in LED to a state.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/DigitalWrite'); this.setHelpUrl("http://arduino.cc/en/Reference/DigitalWrite");
this.setColour(250); this.setColour(250);
this.appendValueInput('STATE') this.appendValueInput("STATE")
.appendField(Blockly.Msg.ARD_BUILTIN_LED) .appendField(Blockly.Msg.ARD_BUILTIN_LED)
.appendField(new Blockly.FieldDropdown( .appendField(
selectedBoard().builtinLed), 'BUILT_IN_LED') new Blockly.FieldDropdown(selectedBoard().builtinLed),
.appendField(Blockly.Msg.ARD_WRITE_TO) "BUILT_IN_LED"
.setCheck(Types.BOOLEAN.compatibleTypes); )
this.setInputsInline(false); .appendField(Blockly.Msg.ARD_WRITE_TO)
this.setPreviousStatement(true, null); .setCheck(Types.BOOLEAN.compatibleTypes);
this.setNextStatement(true, null); this.setInputsInline(false);
this.setTooltip(Blockly.Msg.ARD_BUILTIN_LED_TIP); this.setPreviousStatement(true, null);
}, this.setNextStatement(true, null);
/** this.setTooltip(Blockly.Msg.ARD_BUILTIN_LED_TIP);
* Updates the content of the the pin related fields. },
* @this Blockly.Block /**
*/ * Updates the content of the the pin related fields.
updateFields: function () { * @this Blockly.Block
Blockly.Arduino.Boards.refreshBlockFieldDropdown( */
this, 'BUILT_IN_LED', 'builtinLed'); updateFields: function () {
}, Blockly.Arduino.Boards.refreshBlockFieldDropdown(
/** @return {!string} The type of input value for the block, an integer. */ this,
getBlockType: function () { "BUILT_IN_LED",
return Types.BOOLEAN; "builtinLed"
}, );
},
/** @return {!string} The type of input value for the block, an integer. */
getBlockType: function () {
return Types.BOOLEAN;
},
}; };
Blockly.Blocks['io_analogwrite'] = { Blockly.Blocks["io_analogwrite"] = {
/** /**
* Block for creating a 'set pin' to an analogue value. * Block for creating a 'set pin' to an analogue value.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/AnalogWrite'); this.setHelpUrl("http://arduino.cc/en/Reference/AnalogWrite");
this.setColour(250); this.setColour(250);
this.appendValueInput('NUM') this.appendValueInput("NUM")
.appendField(Blockly.Msg.ARD_ANALOGWRITE) .appendField(Blockly.Msg.ARD_ANALOGWRITE)
.appendField(new Blockly.FieldDropdown( .appendField(new Blockly.FieldDropdown(selectedBoard().pwmPins), "PIN")
selectedBoard().pwmPins), 'PIN') .appendField(Blockly.Msg.ARD_WRITE_TO)
.appendField(Blockly.Msg.ARD_WRITE_TO) .setCheck(Types.NUMBER.compatibleTypes);
.setCheck(Types.NUMBER.compatibleTypes); this.setInputsInline(false);
this.setInputsInline(false); this.setPreviousStatement(true, null);
this.setPreviousStatement(true, null); this.setNextStatement(true, null);
this.setNextStatement(true, null); this.setTooltip(Blockly.Msg.ARD_ANALOGWRITE_TIP);
this.setTooltip(Blockly.Msg.ARD_ANALOGWRITE_TIP); },
}, /**
/** * Updates the content of the the pin related fields.
* Updates the content of the the pin related fields. * @this Blockly.Block
* @this Blockly.Block */
*/ updateFields: function () {
updateFields: function () { Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, "PIN", "pwmPins");
Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, 'PIN', 'pwmPins'); },
}, /** @return {!string} The type of input value for the block, an integer. */
/** @return {!string} The type of input value for the block, an integer. */ getBlockType: function () {
getBlockType: function () { return Types.NUMBER;
return Types.NUMBER; },
},
}; };
Blockly.Blocks['io_analogread'] = { Blockly.Blocks["io_analogread"] = {
/** /**
* Block for reading an analogue input. * Block for reading an analogue input.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/AnalogRead'); this.setHelpUrl("http://arduino.cc/en/Reference/AnalogRead");
this.setColour(250); this.setColour(250);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.ARD_ANALOGREAD) .appendField(Blockly.Msg.ARD_ANALOGREAD)
.appendField(new Blockly.FieldDropdown( .appendField(
selectedBoard().analogPins), 'PIN'); new Blockly.FieldDropdown(selectedBoard().analogPins),
this.setOutput(true, Types.NUMBER.typeId); "PIN"
this.setTooltip(Blockly.Msg.ARD_ANALOGREAD_TIP); );
}, this.setOutput(true, Types.NUMBER.typeName);
/** @return {!string} The type of return value for the block, an integer. */ this.setTooltip(Blockly.Msg.ARD_ANALOGREAD_TIP);
getBlockType: function () { },
return Types.NUMBER.typeId; /** @return {!string} The type of return value for the block, an integer. */
}, getBlockType: function () {
/** return Types.NUMBER.typeName;
* Updates the content of the the pin related fields. },
* @this Blockly.Block /**
*/ * Updates the content of the the pin related fields.
updateFields: function () { * @this Blockly.Block
Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, 'PIN', 'analogPins'); */
} updateFields: function () {
Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, "PIN", "analogPins");
},
}; };
Blockly.Blocks['io_highlow'] = { Blockly.Blocks["io_highlow"] = {
/** /**
* Block for creating a pin state. * Block for creating a pin state.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Constants'); this.setHelpUrl("http://arduino.cc/en/Reference/Constants");
this.setColour(250); this.setColour(250);
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField( new Blockly.FieldDropdown([
new Blockly.FieldDropdown([[Blockly.Msg.ARD_HIGH, 'HIGH'], [Blockly.Msg.ARD_LOW, 'LOW']]), [Blockly.Msg.ARD_HIGH, "HIGH"],
'STATE'); [Blockly.Msg.ARD_LOW, "LOW"],
this.setOutput(true, Types.BOOLEAN.typeId); ]),
this.setTooltip(Blockly.Msg.ARD_HIGHLOW_TIP); "STATE"
}, );
/** @return {!string} The type of return value for the block, an integer. */ this.setOutput(true, Types.BOOLEAN.typeName);
getBlockType: function () { this.setTooltip(Blockly.Msg.ARD_HIGHLOW_TIP);
return Types.BOOLEAN; },
} /** @return {!string} The type of return value for the block, an integer. */
getBlockType: function () {
return Types.BOOLEAN;
},
}; };
Blockly.Blocks['io_pulsein'] = { Blockly.Blocks["io_pulsein"] = {
/** /**
* Block for measuring the duration of a pulse in an input pin. * Block for measuring the duration of a pulse in an input pin.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.jsonInit({ this.jsonInit({
"type": "math_foo", type: "math_foo",
"message0": Blockly.Msg.ARD_PULSE_READ, message0: Blockly.Msg.ARD_PULSE_READ,
"args0": [{ args0: [
"type": "input_value", {
"name": "PULSETYPE", type: "input_value",
"check": Types.BOOLEAN.compatibleTypes name: "PULSETYPE",
}, { check: Types.BOOLEAN.compatibleTypes,
"type": "field_dropdown", },
"name": "PULSEPIN", {
"options": selectedBoard().digitalPins, type: "field_dropdown",
} name: "PULSEPIN",
], options: selectedBoard().digitalPins,
"output": Types.NUMBER.typeId, },
"inputsInline": true, ],
"colour": 250, output: Types.NUMBER.typeName,
"tooltip": Blockly.Msg.ARD_PULSE_TIP, inputsInline: true,
"helpUrl": 'https://www.arduino.cc/en/Reference/PulseIn' colour: 250,
}); tooltip: Blockly.Msg.ARD_PULSE_TIP,
}, helpUrl: "https://www.arduino.cc/en/Reference/PulseIn",
/** @return {!string} The type of input value for the block, an integer. */ });
getBlockType: function () { },
return Types.NUMBER.typeId; /** @return {!string} The type of input value for the block, an integer. */
} getBlockType: function () {
return Types.NUMBER.typeName;
},
}; };
Blockly.Blocks['io_pulsetimeout'] = { Blockly.Blocks["io_pulsetimeout"] = {
/** /**
* Block for measuring (with a time-out) the duration of a pulse in an input * Block for measuring (with a time-out) the duration of a pulse in an input
* pin. * pin.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.jsonInit({ this.jsonInit({
"type": "math_foo", type: "math_foo",
"message0": Blockly.Msg.ARD_PULSE_READ_TIMEOUT, message0: Blockly.Msg.ARD_PULSE_READ_TIMEOUT,
"args0": [{ args0: [
"type": "input_value", {
"name": "PULSETYPE", type: "input_value",
"check": Types.BOOLEAN.compatibleTypes name: "PULSETYPE",
}, { check: Types.BOOLEAN.compatibleTypes,
"type": "field_dropdown", },
"name": "PULSEPIN", {
"options": selectedBoard().digitalPins, type: "field_dropdown",
}, { name: "PULSEPIN",
"type": "input_value", options: selectedBoard().digitalPins,
"name": "TIMEOUT", },
"check": Types.NUMBER.compatibleTypes {
} type: "input_value",
], name: "TIMEOUT",
"output": Types.NUMBER.typeId, check: Types.NUMBER.compatibleTypes,
"inputsInline": true, },
"colour": 250, ],
"tooltip": Blockly.Msg.ARD_PULSETIMEOUT_TIP, output: Types.NUMBER.typeName,
"helpUrl": 'https://www.arduino.cc/en/Reference/PulseIn' inputsInline: true,
}); colour: 250,
}, tooltip: Blockly.Msg.ARD_PULSETIMEOUT_TIP,
/** @return {!string} The type of input value for the block, an integer. */ helpUrl: "https://www.arduino.cc/en/Reference/PulseIn",
getBlockType: function () { });
return Types.NUMBER.typeId; },
} /** @return {!string} The type of input value for the block, an integer. */
getBlockType: function () {
return Types.NUMBER.typeName;
},
}; };

View File

@ -1,59 +1,54 @@
import Blockly, { FieldDropdown } from 'blockly/core' import Blockly, { FieldDropdown } from "blockly/core";
import * as Types from '../helpers/types' import * as Types from "../helpers/types";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
Blockly.Blocks['lists_create_empty'] = { Blockly.Blocks["lists_create_empty"] = {
/** /**
* Elapsed time in milliseconds block definition * Elapsed time in milliseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Millis'); this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
this.setColour(getColour().arrays); this.setColour(getColour().arrays);
this.appendDummyInput() this.appendDummyInput().appendField("create List with");
.appendField("create List with") this.appendValueInput("NUMBER");
this.appendValueInput('NUMBER'); this.appendDummyInput()
this.appendDummyInput() .appendField("Items of Type")
.appendField("Items of Type") .appendField(new FieldDropdown(Types.VARIABLE_TYPES), "type");
.appendField(new FieldDropdown(Types.VARIABLE_TYPES), 'type'); this.setOutput(true, Types.ARRAY.typeName);
this.setOutput(true, Types.ARRAY.typeId); this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP); },
},
}; };
Blockly.Blocks["array_getIndex"] = {
Blockly.Blocks['array_getIndex'] = { /**
/** * Elapsed time in milliseconds block definition
* Elapsed time in milliseconds block definition * @this Blockly.Block
* @this Blockly.Block */
*/ init: function () {
init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
this.setHelpUrl('http://arduino.cc/en/Reference/Millis'); this.setColour(getColour().arrays);
this.setColour(getColour().arrays); this.appendDummyInput().appendField(
this.appendDummyInput() new Blockly.FieldVariable("X", null, ["Array"], "Array"),
.appendField(new Blockly.FieldVariable( "FIELDNAME"
'X', );
null, this.setOutput(true, Types.ARRAY.typeName);
['Array'], this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
'Array' },
), 'FIELDNAME');
this.setOutput(true, Types.ARRAY.typeId);
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
},
}; };
Blockly.Blocks['lists_length'] = { Blockly.Blocks["lists_length"] = {
/** /**
* Elapsed time in milliseconds block definition * Elapsed time in milliseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Millis'); this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
this.setColour(getColour().arrays); this.setColour(getColour().arrays);
this.appendValueInput('ARRAY') this.appendValueInput("ARRAY")
.appendField('length of') .appendField("length of")
.setCheck(Types.ARRAY.compatibleTypes); .setCheck(Types.ARRAY.compatibleTypes);
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP); this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
}, },
}; };

File diff suppressed because it is too large Load Diff

View File

@ -11,40 +11,39 @@
* TODO: This block can be improved to set the new range properly. * TODO: This block can be improved to set the new range properly.
*/ */
import * as Blockly from "blockly/core";
import { getColour } from "../helpers/colour";
import * as Types from "../helpers/types";
import * as Blockly from 'blockly/core'; Blockly.Blocks["base_map"] = {
import { getColour } from '../helpers/colour'; /**
import * as Types from '../helpers/types' * Block for creating a the map function.
* @this Blockly.Block
Blockly.Blocks['base_map'] = { */
/** init: function () {
* Block for creating a the map function. this.setHelpUrl("http://arduino.cc/en/Reference/map");
* @this Blockly.Block this.setColour(getColour().math);
*/ this.appendValueInput("NUM")
init: function () { .appendField(Blockly.Msg.ARD_MAP)
this.setHelpUrl('http://arduino.cc/en/Reference/map'); .setCheck(Types.NUMBER.compatibleTypes);
this.setColour(getColour().math); this.appendValueInput("FMIN")
this.appendValueInput('NUM') .appendField(Blockly.Msg.ARD_MAP_FROMMIN)
.appendField(Blockly.Msg.ARD_MAP) .setCheck(Types.NUMBER.compatibleTypes);
.setCheck(Types.NUMBER.compatibleTypes); this.appendValueInput("FMAX")
this.appendValueInput('FMIN') .appendField(Blockly.Msg.ARD_MAP_FROMMAX)
.appendField(Blockly.Msg.ARD_MAP_FROMMIN) .setCheck(Types.NUMBER.compatibleTypes);
.setCheck(Types.NUMBER.compatibleTypes); this.appendValueInput("DMIN")
this.appendValueInput('FMAX') .appendField(Blockly.Msg.ARD_MAP_TOMIN)
.appendField(Blockly.Msg.ARD_MAP_FROMMAX) .setCheck(Types.NUMBER.compatibleTypes);
.setCheck(Types.NUMBER.compatibleTypes); this.appendValueInput("DMAX")
this.appendValueInput('DMIN') .appendField(Blockly.Msg.ARD_MAP_TOMAX)
.appendField(Blockly.Msg.ARD_MAP_TOMIN) .setCheck(Types.NUMBER.compatibleTypes);
.setCheck(Types.NUMBER.compatibleTypes); this.setOutput(true);
this.appendValueInput('DMAX') this.setInputsInline(false);
.appendField(Blockly.Msg.ARD_MAP_TOMAX) this.setTooltip(Blockly.Msg.ARD_MAP_TIP);
.setCheck(Types.NUMBER.compatibleTypes); },
this.setOutput(true); /** @return {string} The type of return value for the block, an integer. */
this.setInputsInline(false); getBlockType: function () {
this.setTooltip(Blockly.Msg.ARD_MAP_TIP); return Types.NUMBER.typeName;
}, },
/** @return {string} The type of return value for the block, an integer. */
getBlockType: function () {
return Types.NUMBER.typeId;
}
}; };

View File

@ -4,6 +4,7 @@ import { getColour } from "../helpers/colour";
Blockly.Blocks["sensebox_phyphox_init"] = { Blockly.Blocks["sensebox_phyphox_init"] = {
init: function () { init: function () {
this.setColour(getColour().phyphox); this.setColour(getColour().phyphox);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_phyphox_init) .appendField(Blockly.Msg.sensebox_phyphox_init)
.appendField(new Blockly.FieldTextInput("Geräte Name"), "devicename"); .appendField(new Blockly.FieldTextInput("Geräte Name"), "devicename");
@ -37,6 +38,7 @@ Blockly.Blocks["sensebox_phyphox_experiment"] = {
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_tooltip); this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
}, },
}; };
@ -63,8 +65,8 @@ Blockly.Blocks["sensebox_phyphox_graph"] = {
.appendField(Blockly.Msg.sensebox_phyphox_graphStyle) .appendField(Blockly.Msg.sensebox_phyphox_graphStyle)
.appendField( .appendField(
new Blockly.FieldDropdown([ new Blockly.FieldDropdown([
[Blockly.Msg.sensebox_phyphox_style_dots, "dots"],
[Blockly.Msg.sensebox_phyphox_style_line, "line"], [Blockly.Msg.sensebox_phyphox_style_line, "line"],
[Blockly.Msg.sensebox_phyphox_style_dots, "dots"],
]), ]),
"style" "style"
); );
@ -77,6 +79,7 @@ Blockly.Blocks["sensebox_phyphox_graph"] = {
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_graph_tooltip); this.setTooltip(Blockly.Msg.sensebox_phyphox_graph_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
}, },
}; };
@ -86,6 +89,7 @@ Blockly.Blocks["sensebox_phyphox_timestamp"] = {
this.appendDummyInput().appendField(Blockly.Msg.sensebox_phyphox_timestamp); this.appendDummyInput().appendField(Blockly.Msg.sensebox_phyphox_timestamp);
this.setOutput(true); this.setOutput(true);
this.setTooltip(Blockly.Msg.sensebox_phyphox_timestamp_tooltip); this.setTooltip(Blockly.Msg.sensebox_phyphox_timestamp_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
}, },
}; };
@ -107,6 +111,7 @@ Blockly.Blocks["sensebox_phyphox_channel"] = {
this.setOutput(true); this.setOutput(true);
this.setTooltip(Blockly.Msg.sensebox_phyphox_channel_tooltip); this.setTooltip(Blockly.Msg.sensebox_phyphox_channel_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
}, },
}; };
@ -129,6 +134,7 @@ Blockly.Blocks["sensebox_phyphox_sendchannel"] = {
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_sendchannel_tooltip); this.setTooltip(Blockly.Msg.sensebox_phyphox_sendchannel_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
}, },
}; };
@ -141,5 +147,6 @@ Blockly.Blocks["sensebox_phyphox_experiment_send"] = {
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_send_tooltip); this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_send_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
}, },
}; };

View File

@ -1,304 +1,329 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
import * as Types from '../helpers/types' import * as Types from "../helpers/types";
import { FieldSlider } from '@blockly/field-slider'; import { FieldSlider } from "@blockly/field-slider";
Blockly.Blocks["sensebox_display_beginDisplay"] = {
Blockly.Blocks['sensebox_display_beginDisplay'] = { init: function () {
init: function () { this.appendDummyInput().appendField(
this.appendDummyInput() Blockly.Msg.senseBox_display_beginDisplay
.appendField(Blockly.Msg.senseBox_display_beginDisplay) );
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_display_beginDisplay_tooltip); this.setTooltip(Blockly.Msg.senseBox_display_beginDisplay_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
} },
}; };
Blockly.Blocks['sensebox_display_clearDisplay'] = { Blockly.Blocks["sensebox_display_clearDisplay"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.senseBox_display_clearDisplay) Blockly.Msg.senseBox_display_clearDisplay
this.setPreviousStatement(true, null); );
this.setNextStatement(true, null); this.setPreviousStatement(true, null);
this.setColour(getColour().sensebox); this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.senseBox_display_clearDisplay_tooltip); this.setColour(getColour().sensebox);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl); this.setTooltip(Blockly.Msg.senseBox_display_clearDisplay_tooltip);
} this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
},
}; };
Blockly.Blocks['sensebox_display_printDisplay'] = { Blockly.Blocks["sensebox_display_printDisplay"] = {
init: function (block) { init: function (block) {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.senseBox_display_printDisplay); Blockly.Msg.senseBox_display_printDisplay
this.appendDummyInput() );
.appendField(Blockly.Msg.senseBox_display_color) this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_display_white, "WHITE,BLACK"], [Blockly.Msg.senseBox_display_black, "BLACK,WHITE"]]), "COLOR"); .appendField(Blockly.Msg.senseBox_display_color)
this.appendDummyInput() .appendField(
.appendField(Blockly.Msg.senseBox_display_setSize) new Blockly.FieldDropdown([
.appendField(new FieldSlider(1, 1, 4), "SIZE"); [Blockly.Msg.senseBox_display_white, "WHITE,BLACK"],
this.appendDummyInput() [Blockly.Msg.senseBox_display_black, "BLACK,WHITE"],
.appendField(Blockly.Msg.senseBox_display_printDisplay_x) ]),
.appendField(new FieldSlider(0, 0, 64), "X"); "COLOR"
this.appendDummyInput() );
.appendField(Blockly.Msg.senseBox_display_printDisplay_y) this.appendDummyInput()
.appendField(new FieldSlider(0, 0, 128), "Y"); .appendField(Blockly.Msg.senseBox_display_setSize)
this.appendValueInput('printDisplay') .appendField(new FieldSlider(1, 1, 4), "SIZE");
.appendField(Blockly.Msg.senseBox_display_printDisplay_value) this.appendDummyInput()
.setCheck(null); .appendField(Blockly.Msg.senseBox_display_printDisplay_x)
this.setPreviousStatement(true, null); .appendField(new FieldSlider(0, 0, 127), "X");
this.setNextStatement(true, null); this.appendDummyInput()
this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tooltip); .appendField(Blockly.Msg.senseBox_display_printDisplay_y)
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl); .appendField(new FieldSlider(0, 0, 63), "Y");
}, this.appendValueInput("printDisplay")
/** .appendField(Blockly.Msg.senseBox_display_printDisplay_value)
* Called whenever anything on the workspace changes. .setCheck(null);
* Add warning if block is not nested inside a the correct loop. this.setPreviousStatement(true, null);
* @param {!Blockly.Events.Abstract} e Change event. this.setNextStatement(true, null);
* @this Blockly.Block this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tooltip);
*/ this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
onchange: function (e) { },
var legal = false; /**
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ['sensebox_display_show'],
};
Blockly.Blocks['sensebox_display_fastPrint'] = {
init: function (block) {
this.setColour(getColour().sensebox);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_display_fastPrint_show);
this.appendValueInput("Title1", 'Title1')
.appendField(Blockly.Msg.senseBox_display_fastPrint_title);
this.appendValueInput("Value1", 'Value1')
.appendField(Blockly.Msg.senseBox_display_fastPrint_value);
this.appendValueInput("Dimension1", 'Dimension1')
.appendField(Blockly.Msg.senseBox_display_fastPrint_dimension);
this.appendValueInput("Title2", 'Title2')
.appendField(Blockly.Msg.senseBox_display_fastPrint_title);
this.appendValueInput("Value2", 'Value2')
.appendField(Blockly.Msg.senseBox_display_fastPrint_value);
this.appendValueInput("Dimension2", 'Dimension2')
.appendField(Blockly.Msg.senseBox_display_fastPrint_dimension);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_display_fastPrint_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
},
/**
* Called whenever anything on the workspace changes. * Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop. * Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event. * @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block * @this Blockly.Block
*/ */
onchange: function (e) { onchange: function (e) {
var legal = false; var legal = false;
// Is the block nested in a loop? // Is the block nested in a loop?
var block = this; var block = this;
do { do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) { if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true; legal = true;
break; break;
} }
block = block.getSurroundParent(); block = block.getSurroundParent();
} while (block); } while (block);
if (legal) { if (legal) {
this.setWarningText(null); this.setWarningText(null);
} else { } else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ['sensebox_display_show'],
};
Blockly.Blocks['sensebox_display_plotDisplay'] = {
init: function () {
this.setColour(getColour().sensebox);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_display_plotDisplay)
this.appendValueInput("Title", 'Text')
.appendField(Blockly.Msg.senseBox_display_plotTitle);
this.appendValueInput("YLabel", 'Text')
.appendField(Blockly.Msg.senseBox_display_plotYLabel);
this.appendValueInput("XLabel", 'Text')
.appendField(Blockly.Msg.senseBox_display_plotXLabel);
this.appendValueInput("XRange1", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotXRange1);
this.appendValueInput("XRange2", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotXRange2)
this.appendValueInput("YRange1", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotYRange1);
this.appendValueInput("YRange2", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotYRange2);
this.setInputsInline(false);
this.appendValueInput("XTick", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotXTick);
this.appendValueInput("YTick", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotYTick);
this.appendValueInput("TimeFrame", 'Number')
.appendField(Blockly.Msg.senseBox_display_plotTimeFrame);
this.appendValueInput('plotDisplay')
.appendField(Blockly.Msg.senseBox_display_printDisplay_value)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ['sensebox_display_show'],
};
Blockly.Blocks['sensebox_display_show'] = {
init: function () {
this.setColour(getColour().sensebox);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_display_show);
this.appendStatementInput('SHOW');
this.setTooltip(Blockly.Msg.sensebox_display_show_tip);
this.setHelpUrl('');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
} }
},
LOOP_TYPES: ["sensebox_display_show"],
}; };
Blockly.Blocks['sensebox_display_fillCircle'] = { Blockly.Blocks["sensebox_display_fastPrint"] = {
init: function () { init: function (block) {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.sensebox_display_fillCircle); Blockly.Msg.senseBox_display_fastPrint_show
this.appendValueInput('X') );
.appendField(Blockly.Msg.senseBox_display_printDisplay_x) this.appendValueInput("Title1", "Title1").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_fastPrint_title
this.appendValueInput('Y') );
.appendField(Blockly.Msg.senseBox_display_printDisplay_y) this.appendValueInput("Value1", "Value1").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_fastPrint_value
this.appendValueInput('Radius') );
.appendField(Blockly.Msg.sensebox_display_fillCircle_radius) this.appendValueInput("Dimension1", "Dimension1").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_fastPrint_dimension
this.appendDummyInput('fill') );
.appendField(Blockly.Msg.senseBox_display_filled) this.appendValueInput("Title2", "Title2").appendField(
.appendField(new Blockly.FieldCheckbox("TRUE"), "FILL"); Blockly.Msg.senseBox_display_fastPrint_title
this.setInputsInline(false); );
this.setTooltip(Blockly.Msg.senseBox_display_fillCircle_tooltip) this.appendValueInput("Value2", "Value2").appendField(
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl) Blockly.Msg.senseBox_display_fastPrint_value
this.setPreviousStatement(true, null); );
this.setNextStatement(true, null); this.appendValueInput("Dimension2", "Dimension2").appendField(
}, Blockly.Msg.senseBox_display_fastPrint_dimension
/** );
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.sensebox_display_fastPrint_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
},
/**
* Called whenever anything on the workspace changes. * Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop. * Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event. * @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block * @this Blockly.Block
*/ */
onchange: function (e) { onchange: function (e) {
var legal = false; var legal = false;
// Is the block nested in a loop? // Is the block nested in a loop?
var block = this; var block = this;
do { do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) { if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true; legal = true;
break; break;
} }
block = block.getSurroundParent(); block = block.getSurroundParent();
} while (block); } while (block);
if (legal) { if (legal) {
this.setWarningText(null); this.setWarningText(null);
} else { } else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
} }
}, },
LOOP_TYPES: ['sensebox_display_show'], LOOP_TYPES: ["sensebox_display_show"],
}; };
Blockly.Blocks['sensebox_display_drawRectangle'] = { Blockly.Blocks["sensebox_display_plotDisplay"] = {
init: function () { init: function () {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.sensebox_display_drawRectangle); Blockly.Msg.senseBox_display_plotDisplay
this.appendValueInput('X') );
.appendField(Blockly.Msg.senseBox_display_printDisplay_x) this.appendValueInput("Title", "Text").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_plotTitle
this.appendValueInput('Y') );
.appendField(Blockly.Msg.senseBox_display_printDisplay_y) this.appendValueInput("YLabel", "Text").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_plotYLabel
this.appendValueInput('width') );
.appendField(Blockly.Msg.sensebox_display_drawRectangle_width) this.appendValueInput("XLabel", "Text").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_plotXLabel
this.appendValueInput('height') );
.appendField(Blockly.Msg.sensebox_display_drawRectangle_height) this.appendValueInput("XRange1", "Number").appendField(
.setCheck(Types.NUMBER.compatibleTypes); Blockly.Msg.senseBox_display_plotXRange1
this.appendDummyInput('fill') );
.appendField(Blockly.Msg.senseBox_display_filled) this.appendValueInput("XRange2", "Number").appendField(
.appendField(new Blockly.FieldCheckbox("TRUE"), "FILL"); Blockly.Msg.senseBox_display_plotXRange2
this.setInputsInline(false); );
this.setTooltip(Blockly.Msg.senseBox_display_drawRectangle_tooltip) this.appendValueInput("YRange1", "Number").appendField(
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl) Blockly.Msg.senseBox_display_plotYRange1
this.setPreviousStatement(true, null); );
this.setNextStatement(true, null); this.appendValueInput("YRange2", "Number").appendField(
}, Blockly.Msg.senseBox_display_plotYRange2
/** );
this.setInputsInline(false);
this.appendValueInput("XTick", "Number").appendField(
Blockly.Msg.senseBox_display_plotXTick
);
this.appendValueInput("YTick", "Number").appendField(
Blockly.Msg.senseBox_display_plotYTick
);
this.appendValueInput("TimeFrame", "Number").appendField(
Blockly.Msg.senseBox_display_plotTimeFrame
);
this.appendValueInput("plotDisplay")
.appendField(Blockly.Msg.senseBox_display_printDisplay_value)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
},
/**
* Called whenever anything on the workspace changes. * Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop. * Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event. * @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block * @this Blockly.Block
*/ */
onchange: function (e) { onchange: function (e) {
var legal = false; var legal = false;
// Is the block nested in a loop? // Is the block nested in a loop?
var block = this; var block = this;
do { do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) { if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true; legal = true;
break; break;
} }
block = block.getSurroundParent(); block = block.getSurroundParent();
} while (block); } while (block);
if (legal) { if (legal) {
this.setWarningText(null); this.setWarningText(null);
} else { } else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
} }
}, },
LOOP_TYPES: ['sensebox_display_show'], LOOP_TYPES: ["sensebox_display_show"],
};
Blockly.Blocks["sensebox_display_show"] = {
init: function () {
this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(Blockly.Msg.sensebox_display_show);
this.appendStatementInput("SHOW");
this.setTooltip(Blockly.Msg.sensebox_display_show_tip);
this.setHelpUrl("");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
};
Blockly.Blocks["sensebox_display_fillCircle"] = {
init: function () {
this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(
Blockly.Msg.sensebox_display_fillCircle
);
this.appendValueInput("X")
.appendField(Blockly.Msg.senseBox_display_printDisplay_x)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendValueInput("Y")
.appendField(Blockly.Msg.senseBox_display_printDisplay_y)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendValueInput("Radius")
.appendField(Blockly.Msg.sensebox_display_fillCircle_radius)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendDummyInput("fill")
.appendField(Blockly.Msg.senseBox_display_filled)
.appendField(new Blockly.FieldCheckbox("TRUE"), "FILL");
this.setInputsInline(false);
this.setTooltip(Blockly.Msg.senseBox_display_fillCircle_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ["sensebox_display_show"],
};
Blockly.Blocks["sensebox_display_drawRectangle"] = {
init: function () {
this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(
Blockly.Msg.sensebox_display_drawRectangle
);
this.appendValueInput("X")
.appendField(Blockly.Msg.senseBox_display_printDisplay_x)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendValueInput("Y")
.appendField(Blockly.Msg.senseBox_display_printDisplay_y)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendValueInput("width")
.appendField(Blockly.Msg.sensebox_display_drawRectangle_width)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendValueInput("height")
.appendField(Blockly.Msg.sensebox_display_drawRectangle_height)
.setCheck(Types.NUMBER.compatibleTypes);
this.appendDummyInput("fill")
.appendField(Blockly.Msg.senseBox_display_filled)
.appendField(new Blockly.FieldCheckbox("TRUE"), "FILL");
this.setInputsInline(false);
this.setTooltip(Blockly.Msg.senseBox_display_drawRectangle_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ["sensebox_display_show"],
}; };

View File

@ -45,15 +45,11 @@ Blockly.Blocks['sensebox_rgb_led'] = {
Blockly.Blocks['sensebox_ws2818_led_init'] = { Blockly.Blocks['sensebox_ws2818_led_init'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, '1'],
[Blockly.Msg.senseBox_ultrasonic_port_B, '3'], [Blockly.Msg.senseBox_ultrasonic_port_C, '5']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led_init) .appendField(Blockly.Msg.senseBox_ws2818_rgb_led_init)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsRGB), "Port")
this.appendValueInput("BRIGHTNESS", "brightness") this.appendValueInput("BRIGHTNESS", "brightness")
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_brightness)); .appendField((Blockly.Msg.senseBox_ws2818_rgb_led_brightness));
this.appendValueInput("NUMBER", "number") this.appendValueInput("NUMBER", "number")
@ -66,15 +62,11 @@ Blockly.Blocks['sensebox_ws2818_led_init'] = {
Blockly.Blocks['sensebox_ws2818_led'] = { Blockly.Blocks['sensebox_ws2818_led'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, '1'],
[Blockly.Msg.senseBox_ultrasonic_port_B, '3'], [Blockly.Msg.senseBox_ultrasonic_port_C, '5']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led) .appendField(Blockly.Msg.senseBox_ws2818_rgb_led)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsRGB), "Port")
this.appendValueInput("POSITION", "position") this.appendValueInput("POSITION", "position")
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_position)); .appendField((Blockly.Msg.senseBox_ws2818_rgb_led_position));
this.appendValueInput("COLOR", 'Number') this.appendValueInput("COLOR", 'Number')

View File

@ -158,7 +158,8 @@ Blockly.Blocks["sensebox_lora_ttn_mapper"] = {
this.appendValueInput("Fix Type").appendField("Fix Type").setCheck(null); this.appendValueInput("Fix Type").appendField("Fix Type").setCheck(null);
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tip); this.setTooltip(Blockly.Msg.sensebox_lora_ttn_mapper_tip);
this.setHelpUrl(Blockly.Msg.sensebox_lora_ttn_mapper_helpurl);
}, },
}; };
@ -299,3 +300,21 @@ Blockly.Blocks["sensebox_lora_cayenne_gps"] = {
}, },
LOOP_TYPES: ["sensebox_lora_cayenne_send"], LOOP_TYPES: ["sensebox_lora_cayenne_send"],
}; };
Blockly.Blocks["sensebox_lora_cayenne_concentration"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_concentration_tip);
this.setHelpUrl("");
this.setColour(getColour().sensebox);
this.appendValueInput("Value").appendField(
Blockly.Msg.senseBox_LoRa_cayenne_concentration
);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
};

View File

@ -0,0 +1,144 @@
import * as Blockly from "blockly/core";
import { getColour } from "../helpers/colour";
import { selectedBoard } from "../helpers/board";
import { FieldSlider } from "@blockly/field-slider";
/**
* Servo Motor
*
*/
Blockly.Blocks["sensebox_motors_beginServoMotor"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_beginServoMotor);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_beginServoMotor_pin)
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "pin")
.setAlign(Blockly.ALIGN_RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_beginServoMotor_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_beginServoMotor_helpurl);
},
};
Blockly.Blocks["sensebox_motors_moveServoMotor"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_moveServoMotor);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_moveServoMotor_pin)
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "pin")
.setAlign(Blockly.ALIGN_RIGHT);
this.appendValueInput("degrees", "Number")
.appendField(Blockly.Msg.sensebox_motors_moveServoMotor_degrees)
.setAlign(Blockly.ALIGN_RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_moveServoMotor_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_moveServoMotor_helpurl);
},
};
/**
* I2C Motor Board
*
*/
Blockly.Blocks["sensebox_motors_I2CMotorBoard_begin"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_begin);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_I2CMotorBoard_begin_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_I2CMotorBoard_begin_helpurl);
},
};
Blockly.Blocks["sensebox_motors_I2CMotorBoard_moveDCMotor"] = {
init: function () {
var dropdownOptions = [[Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_left, '1'],
[Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_right, '2']];
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor)
.appendField(new Blockly.FieldDropdown(dropdownOptions), "motor")
.appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_motor);
this.appendValueInput("speed", "Number")
.appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_speed)
.setAlign(Blockly.ALIGN_RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_helpurl);
},
};
Blockly.Blocks["sensebox_motors_I2CMotorBoard_stopDCMotor"] = {
init: function () {
var dropdownOptions = [[Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_left, '1'],
[Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_right, '2']];
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor)
.appendField(new Blockly.FieldDropdown(dropdownOptions), "motor")
.appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_motor)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_helpurl);
},
};
/**
* Stepper Motor
*
*/
Blockly.Blocks["sensebox_motors_beginStepperMotor"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_beginStepperMotor);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_beginStepperMotor_pins);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "in1")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "in2")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "in3")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "in4");
this.setFieldValue("1", "in1");
this.setFieldValue("2", "in2");
this.setFieldValue("3", "in3");
this.setFieldValue("4", "in4");
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_beginStepperMotor_rpm)
.appendField(new FieldSlider(3, 1, 3), "rpm");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_beginStepperMotor_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_beginStepperMotor_helpurl);
},
};
Blockly.Blocks["sensebox_motors_moveStepperMotor"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_motors_moveStepperMotor);
this.appendValueInput("steps", "Number")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.sensebox_motors_moveStepperMotor_step);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().motors);
this.setTooltip(Blockly.Msg.sensebox_motors_moveStepperMotor_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_motors_moveStepperMotor_helpurl);
},
};

View File

@ -0,0 +1,42 @@
import * as Blockly from "blockly";
import { getColour } from "../helpers/colour";
import * as Types from "../helpers/types";
Blockly.Blocks["sensebox_ntp_init"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_ntp_helpurl);
this.setColour(getColour().time);
this.appendDummyInput().appendField(Blockly.Msg.sensebox_ntp_init);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.sensebox_ntp_tooltip);
},
};
Blockly.Blocks["sensebox_ntp_get"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_ntp_get_helpurl);
this.setColour(getColour().time);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_ntp_get)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.sensebox_ntp_epochTime, "getEpochTime"],
[Blockly.Msg.sensebox_ntp_formattedTimeStamp, "getFormattedTime"],
]),
"dropdown"
);
this.setOutput(true, Types.LARGE_NUMBER.typeName);
this.setTooltip(Blockly.Msg.sensebox_rtc_get_tooltip);
},
};
Blockly.Blocks["sensebox_ntp_get_timestamp"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
this.setColour(getColour().time);
this.appendDummyInput().appendField(Blockly.Msg.sensebox_rtc_get_timestamp);
this.setOutput(true);
this.setTooltip(Blockly.Msg.sensebox_rtc_get_timestamp_tooltip);
},
};

View File

@ -1,202 +1,199 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
import store from '../../../store'; import store from "../../../store";
var boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null; var boxes = store.getState().auth.user
? store.getState().auth.user.boxes
: null;
store.subscribe(() => { store.subscribe(() => {
boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null; boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null;
}); });
var selectedBox = ''; var selectedBox = "";
Blockly.Blocks["sensebox_osem_connection"] = {
init: function () {
var ssl = "TRUE";
this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip);
this.setHelpUrl(Blockly.Msg.senseBox_osem_connection_helpurl);
this.setColour(getColour().sensebox);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_osem_connection)
.appendField("SSL")
.appendField(new Blockly.FieldCheckbox(ssl), "SSL");
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_osem_restart)
.appendField(new Blockly.FieldCheckbox("TRUE"), "RESTART");
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_exposure)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_osem_stationary, "Stationary"],
[Blockly.Msg.senseBox_osem_mobile, "Mobile"],
]),
"type"
);
if (!boxes) {
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID");
} else {
var dropdown = [];
for (var i = 0; i < boxes.length; i++) {
dropdown.push([boxes[i].name, boxes[i]._id]);
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldDropdown(dropdown), "BoxID");
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_access_token)
.appendField(new Blockly.FieldTextInput("access_token"), "access_token");
this.appendStatementInput("DO")
.appendField(Blockly.Msg.senseBox_sensor)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.getField("type").setValidator(
function (val) {
this.updateShape_(val === "Mobile");
}.bind(this)
);
},
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
Blockly.Blocks['sensebox_osem_connection'] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip);
this.setHelpUrl('');
this.setColour(getColour().sensebox);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_osem_connection)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_osem_host, '"ingress.opensensemap.org"'], [Blockly.Msg.senseBox_osem_host_workshop, '"ingress.workshop.opensensemap.org"']]), "host")
.appendField('SSL')
.appendField(new Blockly.FieldCheckbox("TRUE"), "SSL");
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_exposure)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_osem_stationary, 'Stationary'], [Blockly.Msg.senseBox_osem_mobile, 'Mobile']]), "type");
if (!boxes) {
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID");
} else {
var dropdown = []
for (var i = 0; i < boxes.length; i++) {
dropdown.push([boxes[i].name, boxes[i]._id])
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldDropdown(dropdown), 'BoxID');
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_access_token)
.appendField(new Blockly.FieldTextInput("access_token"), "access_token");
this.appendStatementInput('DO')
.appendField(Blockly.Msg.senseBox_sensor)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
/**
* List of block types that are loops and thus do not need warnings.
* To add a new loop type add this to your code:
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
*/
selectedBox = this.getFieldValue('BoxID');
if (selectedBox !== '' && boxes) {
var accessToken = boxes.find(element => element._id === selectedBox).access_token
if (accessToken !== undefined) {
this.getField('access_token').setValue(accessToken)
} else {
this.getField('access_token').setValue('access_token')
}
}
},
mutationToDom: function () {
var container = document.createElement('mutation');
var input = this.getFieldValue('type');
this.updateShape_(input);
container.setAttribute('type', input);
return container;
},
domToMutation: function (xmlElement) {
var connections = xmlElement.getAttribute('connections');
this.updateShape_(connections);
},
/** /**
* Modify this block to have the correct number of pins available. * List of block types that are loops and thus do not need warnings.
* @param {boolean} * To add a new loop type add this to your code:
* @private * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
* @this Blockly.Block
*/ */
updateShape_: function () { selectedBox = this.getFieldValue("BoxID");
var extraFieldExist = this.getFieldValue('gps'); if (selectedBox !== "" && boxes) {
var input = this.getFieldValue('type'); var accessToken = boxes.find(
if ((input === 'Mobile') && extraFieldExist === null) { (element) => element._id === selectedBox
this.appendValueInput('lat', 'Number') ).access_token;
.appendField(Blockly.Msg.senseBox_gps_lat, 'gps'); if (accessToken !== undefined) {
this.appendValueInput('lng', 'Number') this.getField("access_token").setValue(accessToken);
.appendField(Blockly.Msg.senseBox_gps_lng); } else {
this.appendValueInput('altitude', 'Number') this.getField("access_token").setValue("access_token");
.appendField(Blockly.Msg.senseBox_gps_alt); }
this.appendValueInput('timeStamp', 'Number') }
.appendField(Blockly.Msg.senseBox_gps_timeStamp); },
} updateShape_(isMobile) {
if (isMobile) {
if (input === 'Stationary' && extraFieldExist !== null) { if (this.getInput("lat") == null) {
this.removeInput('lat'); this.appendValueInput("lat", "Number").appendField(
this.removeInput('lng'); Blockly.Msg.senseBox_gps_lat,
this.removeInput('altitude'); "gps"
this.removeInput('timeStamp'); );
} this.appendValueInput("lng", "Number").appendField(
}, Blockly.Msg.senseBox_gps_lng
LOOP_TYPES: ['sensebox_interval_timer'] );
this.appendValueInput("altitude", "Number").appendField(
Blockly.Msg.senseBox_gps_alt
);
this.appendValueInput("timeStamp", "Number").appendField(
Blockly.Msg.senseBox_gps_timeStamp
);
}
} else {
this.removeInput("lat", true);
this.removeInput("lng", true);
this.removeInput("altitude", true);
this.removeInput("timeStamp", true);
}
},
LOOP_TYPES: ["sensebox_interval_timer"],
}; };
Blockly.Blocks['sensebox_send_to_osem'] = { Blockly.Blocks["sensebox_send_to_osem"] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip); this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip);
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_send_to_osem);
.appendField(Blockly.Msg.senseBox_send_to_osem); if (boxes) {
if (boxes) { this.appendValueInput("Value")
this.appendValueInput('Value') .appendField("Phänomen")
.appendField('Phänomen') .appendField(
.appendField(new Blockly.FieldDropdown( new Blockly.FieldDropdown(this.generateOptions),
this.generateOptions), 'SensorID'); "SensorID"
} else { );
this.appendValueInput('Value') } else {
.setAlign(Blockly.ALIGN_LEFT) this.appendValueInput("Value")
.appendField('Phänomen') .setAlign(Blockly.ALIGN_LEFT)
.appendField(new Blockly.FieldTextInput( .appendField("Phänomen")
'sensorID'), 'SensorID') .appendField(new Blockly.FieldTextInput("sensorID"), "SensorID");
}
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
generateOptions: function () {
var dropdown = [["", ""]];
var boxID = selectedBox;
if (boxID !== "" && boxes) {
let box = boxes.find((el) => el._id === boxID);
if (box !== undefined) {
for (var i = 0; i < box.sensors.length; i++) {
dropdown.push([box.sensors[i].title, box.sensors[i]._id]);
} }
}
this.setPreviousStatement(true, null); if (dropdown.length > 1) {
this.setNextStatement(true, null); var options = dropdown.slice(1);
}, return options;
} else {
generateOptions: function () { return dropdown;
var dropdown = [['', '']]; }
var boxID = selectedBox; }
if (boxID !== '' && boxes) { return dropdown;
},
let box = boxes.find(el => el._id === boxID); /**
if (box !== undefined) { * Called whenever anything on the workspace changes.
for (var i = 0; i < box.sensors.length; i++) { * Add warning if block is not nested inside a the correct loop.
dropdown.push([box.sensors[i].title, box.sensors[i]._id]) * @param {!Blockly.Events.Abstract} e Change event.
} * @this Blockly.Block
} */
if (dropdown.length > 1) { onchange: function () {
var options = dropdown.slice(1) var legal = false;
return options // Is the block nested in a loop?
} else { var block = this;
return dropdown do {
} if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
} legal = true;
return dropdown break;
}, }
/** block = block.getSurroundParent();
* Called whenever anything on the workspace changes. } while (block);
* Add warning if block is not nested inside a the correct loop. if (legal) {
* @param {!Blockly.Events.Abstract} e Change event. this.setWarningText(null);
* @this Blockly.Block } else {
*/ this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
onchange: function () { }
},
var legal = false; /**
// Is the block nested in a loop? * List of block types that are loops and thus do not need warnings.
var block = this; * To add a new loop type add this to your code:
do { * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
if (this.LOOP_TYPES.indexOf(block.type) !== -1) { */
legal = true; LOOP_TYPES: ["sensebox_osem_connection"],
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
/**
* List of block types that are loops and thus do not need warnings.
* To add a new loop type add this to your code:
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
*/
LOOP_TYPES: ['sensebox_osem_connection']
}; };

View File

@ -62,7 +62,7 @@ Blockly.Blocks["sensebox_rtc_get"] = {
]), ]),
"dropdown" "dropdown"
); );
this.setOutput(true, Types.LARGE_NUMBER.typeId); this.setOutput(true, Types.LARGE_NUMBER.typeName);
this.setTooltip(Blockly.Msg.sensebox_rtc_get_tooltip); this.setTooltip(Blockly.Msg.sensebox_rtc_get_tooltip);
}, },
}; };
@ -76,3 +76,67 @@ Blockly.Blocks["sensebox_rtc_get_timestamp"] = {
this.setTooltip(Blockly.Msg.sensebox_rtc_get_timestamp_tooltip); this.setTooltip(Blockly.Msg.sensebox_rtc_get_timestamp_tooltip);
}, },
}; };
/**
* Internal RTC
*
*/
Blockly.Blocks["sensebox_internal_rtc_init"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_internal_rtc_helpurl);
this.setColour(getColour().time);
this.appendDummyInput().appendField(Blockly.Msg.sensebox_internal_rtc_init);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.sensebox_internal_rtc_init_tooltip);
},
};
Blockly.Blocks["sensebox_internal_rtc_set"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
this.setColour(getColour().time);
this.appendValueInput("time").appendField(
Blockly.Msg.sensebox_internal_rtc_set
);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.sensebox_internal_rtc_set_tooltip);
},
};
Blockly.Blocks["sensebox_internal_rtc_get"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
this.setColour(getColour().time);
this.appendDummyInput()
.appendField(Blockly.Msg.sensebox_internal_rtc_get)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.sensebox_internal_rtc_epoch, "Epoch"],
[Blockly.Msg.sensebox_internal_rtc_year, "Year"],
[Blockly.Msg.sensebox_internal_rtc_month, "Month"],
[Blockly.Msg.sensebox_internal_rtc_day, "Day"],
[Blockly.Msg.sensebox_internal_rtc_hour, "Hours"],
[Blockly.Msg.sensebox_internal_rtc_minutes, "Minutes"],
[Blockly.Msg.sensebox_internal_rtc_seconds, "Seconds"],
]),
"dropdown"
);
this.setOutput(true, Types.LARGE_NUMBER.typeName);
this.setTooltip(Blockly.Msg.sensebox_internal_rtc_get_tooltip);
},
};
Blockly.Blocks["sensebox_internal_rtc_get_timestamp"] = {
init: function () {
this.setHelpUrl(Blockly.Msg.sensebox_internal_rtc_helpurl);
this.setColour(getColour().time);
this.appendDummyInput().appendField(
Blockly.Msg.sensebox_internal_rtc_get_timestamp
);
this.setOutput(true);
this.setTooltip(Blockly.Msg.sensebox_internal_rtc_get_timestamp_tooltip);
},
};

View File

@ -1,80 +1,174 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
var checkFileName = function (filename) {
var length = filename.length;
if (length > 8) {
alert("dateiname sollte kleiner als 8 Zeichen sein");
return filename.slice(0, 8);
}
return filename;
};
Blockly.Blocks['sensebox_sd_open_file'] = { Blockly.Blocks["sensebox_sd_open_file"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_open_file) .appendField(Blockly.Msg.senseBox_sd_open_file)
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField( .appendField(
new Blockly.FieldTextInput('Data.txt'), new Blockly.FieldTextInput("Data", checkFileName),
'Filename'); "Filename"
this.appendStatementInput('SD') )
.setCheck(null); .appendField(".")
this.setPreviousStatement(true, null); .appendField(
this.setNextStatement(true, null); new Blockly.FieldDropdown([
this.setColour(getColour().sensebox); ["txt", "txt"],
this.setTooltip(Blockly.Msg.senseBox_sd_open_file_tooltip); ["csv", "csv"],
this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/'); ]),
"extension"
);
this.appendStatementInput("SD").setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_open_file_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
},
};
Blockly.Blocks["sensebox_sd_create_file"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_create_file)
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_output_filename)
.appendField(
new Blockly.FieldTextInput("Data", checkFileName),
"Filename"
)
.appendField(".")
.appendField(
new Blockly.FieldDropdown([
["txt", "txt"],
["csv", "csv"],
]),
"extension"
);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_create_file_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
},
};
Blockly.Blocks["sensebox_sd_write_file"] = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sd_write_file)
.setAlign(Blockly.ALIGN_LEFT);
this.appendValueInput("DATA").setCheck(null);
this.appendDummyInput("CheckboxText")
.appendField(Blockly.Msg.senseBox_output_linebreak)
.appendField(new Blockly.FieldCheckbox("TRUE"), "linebreak");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sd_write_file_tooltip);
this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
} }
},
LOOP_TYPES: ["sensebox_sd_open_file"],
}; };
Blockly.Blocks['sensebox_sd_create_file'] = { Blockly.Blocks["sensebox_sd_osem"] = {
init: function () { init: function () {
this.appendDummyInput() this.setTooltip(Blockly.Msg.sensebox_sd_osem_tip);
.appendField(Blockly.Msg.senseBox_sd_create_file) this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
.setAlign(Blockly.ALIGN_LEFT) this.setColour(getColour().sensebox);
.appendField(Blockly.Msg.senseBox_output_filename) this.appendDummyInput()
.appendField( .setAlign(Blockly.ALIGN_LEFT)
new Blockly.FieldTextInput('Data.txt'), .appendField(Blockly.Msg.sensebox_sd_osem);
'Filename'); this.appendDummyInput()
this.setPreviousStatement(true, null); .setAlign(Blockly.ALIGN_LEFT)
this.setNextStatement(true, null); .appendField(Blockly.Msg.senseBox_osem_exposure)
this.setColour(getColour().sensebox); .appendField(
this.setTooltip(Blockly.Msg.senseBox_sd_create_file_tooltip); new Blockly.FieldDropdown([
this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/'); [Blockly.Msg.senseBox_osem_stationary, "Stationary"],
[Blockly.Msg.senseBox_osem_mobile, "Mobile"],
]),
"type"
);
this.appendValueInput("timeStamp", "Number").appendField(
Blockly.Msg.senseBox_gps_timeStamp
);
this.appendStatementInput("DO")
.appendField(Blockly.Msg.sensebox_sd_measurement)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.getField("type").setValidator(
function (val) {
this.updateShape_(val === "Mobile");
}.bind(this)
);
},
updateShape_(isMobile) {
if (isMobile) {
if (this.getInput("lat") == null) {
this.appendValueInput("lat", "Number").appendField(
Blockly.Msg.senseBox_gps_lat,
"gps"
);
this.appendValueInput("lng", "Number").appendField(
Blockly.Msg.senseBox_gps_lng
);
this.appendValueInput("altitude", "Number").appendField(
Blockly.Msg.senseBox_gps_alt
);
}
} else {
this.removeInput("lat", true);
this.removeInput("lng", true);
this.removeInput("altitude", true);
} }
},
}; };
Blockly.Blocks['sensebox_sd_write_file'] = { Blockly.Blocks["sensebox_sd_save_for_osem"] = {
init: function () { init: function () {
this.appendDummyInput() this.setTooltip(Blockly.Msg.sensebox_sd_save_for_osem_tip);
.appendField(Blockly.Msg.senseBox_sd_write_file) this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
.setAlign(Blockly.ALIGN_LEFT); this.setColour(getColour().sensebox);
this.appendValueInput('DATA') this.appendDummyInput().appendField(Blockly.Msg.sensebox_sd_save_for_osem);
.setCheck(null); this.appendValueInput("Value")
this.appendDummyInput('CheckboxText') .setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_output_linebreak) .appendField(Blockly.Msg.sensebox_sd_save_for_osem_id)
.appendField(new Blockly.FieldCheckbox('TRUE'), 'linebreak'); .appendField(new Blockly.FieldTextInput("sensorID"), "SensorID");
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.setColour(getColour().sensebox); },
this.setTooltip(Blockly.Msg.senseBox_sd_write_file_tooltip);
this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/');
},
/**
* Called whenever anything on the workspace changes.
* Add warning if block is not nested inside a the correct loop.
* @param {!Blockly.Events.Abstract} e Change event.
* @this Blockly.Block
*/
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
LOOP_TYPES: ['sensebox_sd_open_file'],
}; };

View File

@ -1,110 +1,156 @@
import Blockly from 'blockly'; import Blockly from "blockly";
import { getColour } from '../helpers/colour' import { getColour } from "../helpers/colour";
import * as Types from '../helpers/types' import * as Types from "../helpers/types";
import { selectedBoard } from '../helpers/board' import { selectedBoard } from "../helpers/board";
import { FieldGridDropdown } from "@blockly/field-grid-dropdown";
/** /**
* HDC1080 Temperature and Humidity Sensor * HDC1080 Temperature and Humidity Sensor
* *
*/ */
Blockly.Blocks['sensebox_sensor_temp_hum'] = { Blockly.Blocks["sensebox_sensor_temp_hum"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_temp_hum);
.appendField(Blockly.Msg.senseBox_temp_hum);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_hum, "Humidity"]]), "NAME"); .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_temp, "Temperature"],
[Blockly.Msg.senseBox_hum, "Humidity"],
]),
"NAME"
);
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_temp_hum_tooltip); this.setTooltip(Blockly.Msg.senseBox_temp_hum_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_temp_hum_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_temp_hum_helpurl);
} this.data = {name: "hdc1080", connection: "I2C"};
},
}; };
/** /**
* VEML6070 and TSL4513 * VEML6070 and TSL4513
* *
*/ */
Blockly.Blocks["sensebox_sensor_uv_light"] = {
Blockly.Blocks['sensebox_sensor_uv_light'] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_uv_light);
.appendField(Blockly.Msg.senseBox_uv_light);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_light, "Illuminance"], [Blockly.Msg.senseBox_uv, "UvIntensity"]]), "NAME"); .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_light, "Illuminance"],
[Blockly.Msg.senseBox_uv, "UvIntensity"],
]),
"NAME"
);
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_uv_light_tooltip); this.setTooltip(Blockly.Msg.senseBox_uv_light_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_uv_light_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_uv_light_helpurl);
} this.data = {name: "veml6070"};
},
}; };
/* /*
BMX055 Three differen Blocks for Accelerometer, Gyroscope, Compass BMX055 Three differen Blocks for Accelerometer, Gyroscope, Compass
*/ */
Blockly.Blocks['sensebox_sensor_bmx055_accelerometer'] = { Blockly.Blocks["sensebox_sensor_bmx055_accelerometer"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.senseBox_bmx055_accelerometer); Blockly.Msg.senseBox_bmx055_accelerometer
);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_bmx055_accelerometer_direction) .appendField(Blockly.Msg.senseBox_bmx055_accelerometer_direction)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_bmx055_accelerometer_direction_x, "X"], [Blockly.Msg.senseBox_bmx055_accelerometer_direction_y, "Y"], [Blockly.Msg.senseBox_bmx055_accelerometer_direction_z, "Z"], [Blockly.Msg.senseBox_bmx055_accelerometer_direction_total, "Total"]]), "VALUE"); .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_bmx055_accelerometer_direction_x, "X"],
[Blockly.Msg.senseBox_bmx055_accelerometer_direction_y, "Y"],
[Blockly.Msg.senseBox_bmx055_accelerometer_direction_z, "Z"],
[Blockly.Msg.senseBox_bmx055_accelerometer_direction_total, "Total"],
]),
"VALUE"
);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_bmx055_accelerometer_range) .appendField(Blockly.Msg.senseBox_bmx055_accelerometer_range)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_bmx055_accelerometer_range_2g, "0x3"], [Blockly.Msg.senseBox_bmx055_accelerometer_range_4g, "0x5"], [Blockly.Msg.senseBox_bmx055_accelerometer_range_8g, "0x8"], [Blockly.Msg.senseBox_bmx055_accelerometer_range_16g, "0x0C"]]), "RANGE"); .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_bmx055_accelerometer_range_2g, "0x3"],
[Blockly.Msg.senseBox_bmx055_accelerometer_range_4g, "0x5"],
[Blockly.Msg.senseBox_bmx055_accelerometer_range_8g, "0x8"],
[Blockly.Msg.senseBox_bmx055_accelerometer_range_16g, "0x0C"],
]),
"RANGE"
);
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_bmx055_accelerometer_tooltip); this.setTooltip(Blockly.Msg.senseBox_bmx055_accelerometer_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_bmx055_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_bmx055_helpurl);
} this.data = {name: "bmx055"};
},
}; };
/** /**
* SDS011 Fine Particular Matter Sensor * SDS011 Fine Particular Matter Sensor
* *
*/ */
Blockly.Blocks['sensebox_sensor_sds011'] = { Blockly.Blocks["sensebox_sensor_sds011"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_sds011);
.appendField(Blockly.Msg.senseBox_sds011);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_sds011_pm25, "Pm25"], [Blockly.Msg.senseBox_sds011_pm10, "Pm10"]]), "NAME") .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_sds011_pm25, "pm25"],
[Blockly.Msg.senseBox_sds011_pm10, "pm10"],
]),
"NAME"
)
.appendField(Blockly.Msg.senseBox_sds011_dimension) .appendField(Blockly.Msg.senseBox_sds011_dimension)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_sds011_serial1, "Serial1"], [Blockly.Msg.senseBox_sds011_serial2, "Serial2"]]), "SERIAL"); .appendField(
new Blockly.FieldDropdown(
selectedBoard().serialSensors),
"SERIAL"
);
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sds011_tooltip); this.setTooltip(Blockly.Msg.senseBox_sds011_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_sds011_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_sds011_helpurl);
} this.data = {name: "sds011"};
},
}; };
/** /**
* BMP280 Pressure Sensor * BMP280 Pressure Sensor
* *
*/ */
Blockly.Blocks['sensebox_sensor_pressure'] = { Blockly.Blocks["sensebox_sensor_pressure"] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_pressure, "Pressure"], [Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_gps_alt, "Altitude"]]; var dropdownOptions = [
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (option) { [Blockly.Msg.senseBox_pressure, "Pressure"],
var input = (option === 'Pressure') || (option === 'Temperature') || (option === 'Altitude'); [Blockly.Msg.senseBox_temp, "Temperature"],
[Blockly.Msg.senseBox_gps_alt, "Altitude"],
];
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (
option
) {
var input =
option === "Pressure" ||
option === "Temperature" ||
option === "Altitude";
this.sourceBlock_.updateShape_(input); this.sourceBlock_.updateShape_(input);
}); });
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_pressure_sensor);
.appendField(Blockly.Msg.senseBox_pressure_sensor);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
@ -113,88 +159,67 @@ Blockly.Blocks['sensebox_sensor_pressure'] = {
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip); this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl);
this.data = {name: "bmp280"};
this.getField("NAME").setValidator(
function (val) {
this.updateShape_(val === "Altitude");
}.bind(this)
);
}, },
/** updateShape_(isAltitude) {
* Parse XML to restore the number of pins available. if (isAltitude) {
* @param {!Element} xmlElement XML storage element. if (this.getInput("extraField") == null) {
* @this Blockly.Block this.appendDummyInput("extraField")
*/ .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
domToMutation: function (xmlElement) { .appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
(xmlElement.getAttribute('port')); .appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
}
}, } else {
/** this.removeInput("extraField", true);
* Create XML to represent number of pins selection.
* @return {!Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement('mutation');
var input = this.getFieldValue('NAME');
this.updateShape_(input);
container.setAttribute('NAME', input);
return container;
},
/**
* Modify this block to have the correct number of pins available.
* @param {boolean}
* @private
* @this Blockly.Block
*/
updateShape_: function () {
var extraFieldExist = this.getFieldValue('referencePressure');
var input = this.getFieldValue('NAME');
if (input === 'Altitude' && extraFieldExist === null) {
this.appendDummyInput('extraField')
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
.appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
.appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
} }
},
if ((input === 'Pressure' || input === 'Temperature') && extraFieldExist !== null) {
this.removeInput('extraField');
}
}
}; };
/** /**
* BME680 Environmental Sensor * BME680 Environmental Sensor
* *
*/ */
Blockly.Blocks['sensebox_sensor_bme680_bsec'] = { Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"], [Blockly.Msg.senseBox_pressure, "pressure"], [Blockly.Msg.senseBox_bme_iaq, "IAQ"], [Blockly.Msg.senseBox_bme_iaq_accuracy, "IAQAccuracy"], [Blockly.Msg.senseBox_bme_co2, "CO2"], [Blockly.Msg.senseBox_bme_breatheVocEquivalent, "breathVocEquivalent"]]; var dropdownOptions = [
this.appendDummyInput() [Blockly.Msg.senseBox_temp, "temperature"],
.appendField(Blockly.Msg.senseBox_bme680); [Blockly.Msg.senseBox_hum, "humidity"],
[Blockly.Msg.senseBox_bme_pressure, "pressure"],
[Blockly.Msg.senseBox_bme_iaq, "IAQ"],
[Blockly.Msg.senseBox_bme_iaq_accuracy, "IAQAccuracy"],
[Blockly.Msg.senseBox_bme_co2, "CO2"],
[Blockly.Msg.senseBox_bme_breatheVocEquivalent, "breathVocEquivalent"],
];
this.appendDummyInput().appendField(Blockly.Msg.senseBox_bme680);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown") .appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown");
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_bme_tooltip); this.setTooltip(Blockly.Msg.senseBox_bme_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_bme680_helpurl) this.setHelpUrl(Blockly.Msg.senseBox_bme680_helpurl);
} this.data = {name: "bme680"};
},
}; };
/** /**
* Ultrasonic Sensor * Ultrasonic Sensor
* *
* *
*/ */
Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = {
Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
init: function () { init: function () {
var dropdown = new FieldGridDropdown(selectedBoard().digitalPorts, function (option) {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, 'A'], var input = option === "A" || option === "B" || option === "C";
[Blockly.Msg.senseBox_ultrasonic_port_B, 'B'], [Blockly.Msg.senseBox_ultrasonic_port_C, 'C']];
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (option) {
var input = (option === 'A') || (option === 'B') || (option === 'C');
this.sourceBlock_.updateShape_(input); this.sourceBlock_.updateShape_(input);
}); });
@ -202,17 +227,26 @@ Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ultrasonic) .appendField(Blockly.Msg.senseBox_ultrasonic)
.appendField(dropdown, "port"); .appendField(dropdown, "port");
this.appendDummyInput('TrigEcho') this.appendDummyInput("TrigEcho")
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_ultrasonic_trigger) .appendField(Blockly.Msg.senseBox_ultrasonic_trigger)
.appendField(new Blockly.FieldDropdown( .appendField(
selectedBoard().digitalPins), 'ultrasonic_trigger') new Blockly.FieldDropdown(selectedBoard().digitalPins),
"ultrasonic_trigger"
)
.appendField(Blockly.Msg.senseBox_ultrasonic_echo) .appendField(Blockly.Msg.senseBox_ultrasonic_echo)
.appendField(new Blockly.FieldDropdown( .appendField(
selectedBoard().digitalPins), 'ultrasonic_echo'); new Blockly.FieldDropdown(selectedBoard().digitalPins),
"ultrasonic_echo"
);
this.appendDummyInput("maxDistance")
.appendField(Blockly.Msg.senseBox_ultrasonic_maxDistance)
.appendField(new Blockly.FieldTextInput("250"), "maxDistance")
.appendField("cm");
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_ultrasonic_tooltip); this.setTooltip(Blockly.Msg.senseBox_ultrasonic_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_ultrasonic_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_ultrasonic_helpurl);
this.data = {name: "hc-sr04"};
}, },
/** /**
* Parse XML to restore the number of pins available. * Parse XML to restore the number of pins available.
@ -220,8 +254,7 @@ Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
domToMutation: function (xmlElement) { domToMutation: function (xmlElement) {
(xmlElement.getAttribute('port')); xmlElement.getAttribute("port");
}, },
/** /**
* Create XML to represent number of pins selection. * Create XML to represent number of pins selection.
@ -229,8 +262,8 @@ Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
mutationToDom: function () { mutationToDom: function () {
var container = document.createElement('mutation'); var container = document.createElement("mutation");
var input = this.getFieldValue('port'); var input = this.getFieldValue("port");
this.updateShape_(input); this.updateShape_(input);
container.setAttribute("port", input); container.setAttribute("port", input);
return container; return container;
@ -242,159 +275,199 @@ Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
updateShape_: function () { updateShape_: function () {
var input = this.getFieldValue('port'); var input = this.getFieldValue("port");
switch (input) { switch (input) {
case 'A': case "A":
this.setFieldValue('1', 'ultrasonic_trigger'); this.setFieldValue("1", "ultrasonic_trigger");
this.setFieldValue('2', 'ultrasonic_echo'); this.setFieldValue("2", "ultrasonic_echo");
break; break;
case 'B': case "B":
this.setFieldValue('3', 'ultrasonic_trigger'); this.setFieldValue("3", "ultrasonic_trigger");
this.setFieldValue('4', 'ultrasonic_echo'); this.setFieldValue("4", "ultrasonic_echo");
break; break;
case 'C': case "C":
this.setFieldValue('5', 'ultrasonic_trigger'); this.setFieldValue("5", "ultrasonic_trigger");
this.setFieldValue('6', 'ultrasonic_echo'); this.setFieldValue("6", "ultrasonic_echo");
break; break;
default: default:
break; break;
} }
} },
}; };
/** /**
* Microphone * Microphone
* *
*/ */
Blockly.Blocks['sensebox_sensor_sound'] = { Blockly.Blocks["sensebox_sensor_sound"] = {
init: function () { init: function () {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_sound) .appendField(Blockly.Msg.senseBox_sound)
.appendField("Pin:") .appendField("Pin:")
.appendField(new Blockly.FieldDropdown(selectedBoard().analogPins), "PIN") .appendField(
new Blockly.FieldDropdown(selectedBoard().analogPins),
"PIN"
);
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setHelpUrl(Blockly.Msg.senseBox_sound_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_sound_helpurl);
this.setTooltip(Blockly.Msg.senseBox_sound_tooltip); this.setTooltip(Blockly.Msg.senseBox_sound_tooltip);
} },
}; };
/** /**
* Button * Button
* *
* *
*/ */
Blockly.Blocks['sensebox_button'] = { Blockly.Blocks["sensebox_button"] = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_button) .appendField(Blockly.Msg.senseBox_button)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_button_isPressed, "isPressed"], [Blockly.Msg.senseBox_button_wasPressed, "wasPressed"], [Blockly.Msg.senseBox_button_switch, "Switch"]]), "FUNCTION") .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_button_isPressed, "isPressed"],
[Blockly.Msg.senseBox_button_wasPressed, "wasPressed"],
[Blockly.Msg.senseBox_button_longPress, "longPress"],
[Blockly.Msg.senseBox_button_switch,"toggleButton"]
]),
"FUNCTION"
)
.appendField("Pin:") .appendField("Pin:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsButton), "PIN"); .appendField(
new Blockly.FieldDropdown(selectedBoard().digitalPinsButton),
"PIN"
);
this.setOutput(true, Types.BOOLEAN.typeName); this.setOutput(true, Types.BOOLEAN.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_button_tooltip); this.setTooltip(Blockly.Msg.senseBox_button_tooltip);
} this.getField("FUNCTION").setValidator(
function (val) {
this.updateShape_(val === "longPress");
}.bind(this)
);
},
updateShape_(isLongPress) {
if (isLongPress) {
if (this.getInput("extraField") == null) {
this.appendDummyInput("extraField")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_button_longPress_time)
.appendField(new Blockly.FieldTextInput("1000"), "time")
.appendField("ms");
}
} else {
this.removeInput("extraField", true);
}
},
}; };
/** /**
* SCD30 CO2 Sensor * SCD30 CO2 Sensor
* *
*/ */
Blockly.Blocks["sensebox_scd30"] = {
Blockly.Blocks['sensebox_scd30'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_scd_co2, "CO2"], [Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"]]; var dropdownOptions = [
this.appendDummyInput() [Blockly.Msg.senseBox_scd_co2, "CO2"],
.appendField(Blockly.Msg.senseBox_scd30); [Blockly.Msg.senseBox_temp, "temperature"],
[Blockly.Msg.senseBox_hum, "humidity"],
];
this.appendDummyInput().appendField(Blockly.Msg.senseBox_scd30);
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown") .appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown");
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_scd_tooltip); this.setTooltip(Blockly.Msg.senseBox_scd_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_scd_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_scd_helpurl);
this.data = {name: "scd30"};
}, },
onchange: function (e) { onchange: function (e) {
var dropdown = this.getFieldValue('dropdown'); var dropdown = this.getFieldValue("dropdown");
if (dropdown === 'temperature' || dropdown === 'humidity') { if (dropdown === "temperature" || dropdown === "humidity") {
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
} else if (dropdown === 'CO2') { } else if (dropdown === "CO2") {
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
} }
} },
}; };
/** /**
* GPS Module * GPS Module
* *
*/ */
Blockly.Blocks["sensebox_gps"] = {
Blockly.Blocks['sensebox_gps'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_gps_lat, "latitude"], [Blockly.Msg.senseBox_gps_lng, "longitude"], [Blockly.Msg.senseBox_gps_alt, "altitude"], ["pDOP", "pDOP"], ["Fix Type", "fixType"]]; var dropdownOptions = [
this.appendDummyInput() [Blockly.Msg.senseBox_gps_lat, "latitude"],
.appendField("GPS Modul"); [Blockly.Msg.senseBox_gps_lng, "longitude"],
[Blockly.Msg.senseBox_gps_alt, "altitude"],
[Blockly.Msg.senseBox_gps_timeStamp, "timestamp"],
[Blockly.Msg.senseBox_gps_speed, "speed"],
["pDOP", "pDOP"],
["Fix Type", "fixType"],
];
this.appendDummyInput().appendField("GPS Modul");
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown") .appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown");
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_gps_tooltip); this.setTooltip(Blockly.Msg.senseBox_gps_tooltip);
} },
}; };
/** /**
* Block for Truebner STM50 * Block for Truebner STM50
*/ */
Blockly.Blocks['sensebox_sensor_truebner_smt50'] = { Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, 'A'],
[Blockly.Msg.senseBox_ultrasonic_port_B, 'B'], [Blockly.Msg.senseBox_ultrasonic_port_C, 'C']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_smt50);
.appendField(Blockly.Msg.senseBox_smt50);
this.appendDummyInput() this.appendDummyInput()
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port");
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_temp, "temp"], [Blockly.Msg.senseBox_soil, "soil"]]), 'value') .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_temp, "temp"],
[Blockly.Msg.senseBox_soil, "soil"],
]),
"value"
);
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_smt50_tooltip); this.setTooltip(Blockly.Msg.senseBox_smt50_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_smt50_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_smt50_helpurl);
} this.data = {name: "smt50"};
},
}; };
/** /**
* DS18B20 Watertemperature * DS18B20 Watertemperature
* *
*/ */
Blockly.Blocks['sensebox_sensor_watertemperature'] = { Blockly.Blocks["sensebox_sensor_watertemperature"] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, 'A'],
[Blockly.Msg.senseBox_ultrasonic_port_B, 'B'], [Blockly.Msg.senseBox_ultrasonic_port_C, 'C']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_watertemperature) .appendField(Blockly.Msg.senseBox_watertemperature)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port");
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip); this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip);
} this.data = {name: "ds18b20"};
},
}; };
/** /**
@ -418,18 +491,95 @@ Blockly.Blocks['sensebox_windspeed'] = {
* DF Robot Soundsensor * DF Robot Soundsensor
*/ */
Blockly.Blocks["sensebox_soundsensor_dfrobot"] = {
Blockly.Blocks['sensebox_soundsensor_dfrobot'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, 'A'],
[Blockly.Msg.senseBox_ultrasonic_port_B, 'B'], [Blockly.Msg.senseBox_ultrasonic_port_C, 'C']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_soundsensor_dfrobot) .appendField(Blockly.Msg.senseBox_soundsensor_dfrobot)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port");
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip); this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl) this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl);
} },
};
/**
* Infineon DPS310 Pressure Sensor
*
*/
Blockly.Blocks["sensebox_sensor_dps310"] = {
init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_pressure, "Pressure"],
[Blockly.Msg.senseBox_temp, "Temperature"],
[Blockly.Msg.senseBox_gps_alt, "Altitude"],
];
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (
option
) {
var input =
option === "Pressure" ||
option === "Temperature" ||
option === "Altitude";
this.sourceBlock_.updateShape_(input);
});
this.appendDummyInput().appendField(Blockly.Msg.senseBox_sensor_dps310);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_value)
.appendField(dropdown, "NAME");
this.setColour(getColour().sensebox);
this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_sensor_dps310_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_sensor_dps310_helpurl);
this.data = {name: "dps310"};
this.getField("NAME").setValidator(
function (val) {
this.updateShape_(val === "Altitude");
}.bind(this)
);
},
updateShape_(isAltitude) {
if (isAltitude) {
if (this.getInput("extraField") == null) {
this.appendDummyInput("extraField")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
.appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
.appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
}
} else {
this.removeInput("extraField", true);
}
},
};
/**
* Sensirion SPS30 Fine Particular Matter Sensor
* added 02.12.2022
*/
Blockly.Blocks["sensebox_sensor_sps30"] = {
init: function () {
this.appendDummyInput().appendField(Blockly.Msg.senseBox_sps30);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_value)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_sps30_1p0, "1p0"],
[Blockly.Msg.senseBox_sps30_2p5, "2p5"],
[Blockly.Msg.senseBox_sps30_4p0, "4p0"],
[Blockly.Msg.senseBox_sps30_10p0, "10p0"],
]),
"value"
)
.appendField(Blockly.Msg.senseBox_sps30_dimension);
this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sps30_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_sps30_helpurl);
},
}; };

View File

@ -1,60 +1,153 @@
import Blockly from 'blockly'; import Blockly from "blockly";
import { getColour } from '../helpers/colour' import { getColour } from "../helpers/colour";
import * as Types from "../helpers/types";
Blockly.Blocks['sensebox_wifi'] = { Blockly.Blocks["sensebox_wifi"] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.senseBox_wifi_tooltip); this.setTooltip(Blockly.Msg.senseBox_wifi_tooltip);
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_connect);
.appendField(Blockly.Msg.senseBox_wifi_connect); this.appendDummyInput()
this.appendDummyInput() .setAlign(Blockly.ALIGN_LEFT)
.setAlign(Blockly.ALIGN_LEFT) .appendField(Blockly.Msg.senseBox_wifi_ssid)
.appendField(Blockly.Msg.senseBox_wifi_ssid) .appendField(new Blockly.FieldTextInput("SSID"), "SSID");
.appendField(new Blockly.FieldTextInput("SSID"), "SSID"); this.appendDummyInput()
this.appendDummyInput() .setAlign(Blockly.ALIGN_LEFT)
.setAlign(Blockly.ALIGN_LEFT) .appendField(Blockly.Msg.senseBox_output_password)
.appendField(Blockly.Msg.senseBox_output_password) .appendField(new Blockly.FieldTextInput("Password"), "Password");
.appendField(new Blockly.FieldTextInput("Password"), "Password"); this.setHelpUrl(Blockly.Msg.senseBox_wifi_helpurl);
this.setHelpUrl(Blockly.Msg.senseBox_wifi_helpurl) this.setPreviousStatement(true, null);
this.setPreviousStatement(true, null); this.setNextStatement(true, null);
this.setNextStatement(true, null); },
}, onchange: function (e) {
onchange: function (e) { var legal = false;
var legal = false; // Is the block nested in a loop?
// Is the block nested in a loop? var block = this;
var block = this; do {
do { if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) { legal = true;
legal = true; break;
break; }
} block = block.getSurroundParent();
block = block.getSurroundParent(); } while (block);
} while (block); if (legal) {
if (legal) { this.setWarningText(null);
this.setWarningText(null); } else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
} else { }
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); },
LOOP_TYPES: ["arduino_functions"],
}
},
LOOP_TYPES: ['arduino_functions'],
}; };
Blockly.Blocks['sensebox_startap'] = { Blockly.Blocks["sensebox_startap"] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.senseBox_wifi_startap_tooltip); this.setTooltip(Blockly.Msg.senseBox_wifi_startap_tooltip);
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_startap);
.appendField(Blockly.Msg.senseBox_wifi_startap); this.appendDummyInput()
this.appendDummyInput() .setAlign(Blockly.ALIGN_LEFT)
.setAlign(Blockly.ALIGN_LEFT) .appendField(Blockly.Msg.senseBox_wifi_ssid)
.appendField(Blockly.Msg.senseBox_wifi_ssid) .appendField(new Blockly.FieldTextInput("SSID"), "SSID");
.appendField(new Blockly.FieldTextInput("SSID"), "SSID"); this.setHelpUrl(Blockly.Msg.senseBox_wifi_helpurl);
this.setHelpUrl(Blockly.Msg.senseBox_wifi_helpurl) this.setPreviousStatement(true, null);
this.setPreviousStatement(true, null); this.setNextStatement(true, null);
this.setNextStatement(true, null); },
};
Blockly.Blocks["sensebox_ethernet"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_ethernet_tooltip);
this.setHelpUrl("");
this.setColour(getColour().sensebox);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ethernet)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_ethernet_dhcp, "Dhcp"],
[Blockly.Msg.senseBox_ethernet_manuel_config, "Manual"],
]),
"dhcp"
);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ethernet_mac)
.appendField(
new Blockly.FieldTextInput("0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED"),
"mac"
);
this.setHelpUrl(Blockly.Msg.senseBox_ethernet_helpurl);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.getField("dhcp").setValidator(
function (val) {
this.updateShape_(val === "Manual");
}.bind(this)
);
},
updateShape_(isManual) {
if (isManual) {
this.appendDummyInput("ip-field")
.appendField(Blockly.Msg.senseBox_ethernet_ip)
.appendField(new Blockly.FieldTextInput("192.168.1.100"), "ip");
this.appendDummyInput("subnetmask-field")
.appendField(Blockly.Msg.senseBox_ethernet_subnetmask)
.appendField(new Blockly.FieldTextInput("255.255.255.0"), "subnetmask");
this.appendDummyInput("gateway-field")
.appendField(Blockly.Msg.senseBox_ethernet_gateway)
.appendField(new Blockly.FieldTextInput("192.168.1.1"), "gateway");
this.appendDummyInput("dns-field")
.appendField(Blockly.Msg.senseBox_ethernet_dns)
.appendField(new Blockly.FieldTextInput("8.8.8.8"), "dns");
} else {
this.removeInput("ip-field", true);
this.removeInput("subnetmask-field", true);
this.removeInput("gateway-field", true);
this.removeInput("dns-field", true);
} }
}; },
};
Blockly.Blocks["sensebox_ethernetIp"] = {
init: function () {
this.appendDummyInput().appendField(Blockly.Msg.senseBox_ethernet_ip);
this.setColour(getColour().sensebox);
this.setHelpUrl(Blockly.Msg.senseBox_ethernetIp_helpurl);
this.setTooltip(Blockly.Msg.senseBox_ethernet_ip_tooltip);
this.setOutput(true, null);
}
};
Blockly.Blocks["sensebox_wifi_status"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_wifi_status_tooltip);
this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_status);
this.setOutput(true, Types.BOOLEAN.typeName);
this.setHelpUrl(Blockly.Msg.senseBox_wifi_status_helpurl);
},
};
Blockly.Blocks["sensebox_get_ip"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_wifi_ip_tooltip);
this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_ip);
this.setOutput(true, Types.TEXT.typeName);
this.setHelpUrl(Blockly.Msg.senseBox_wifi_ip_helpurl);
},
};
Blockly.Blocks["sensebox_wifi_rssi"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_wifi_rssi_tooltip);
this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_rssi);
this.setOutput(true, Types.NUMBER.typeName);
this.setHelpUrl(Blockly.Msg.senseBox_wifi_rssi_helpurl);
},
};

View File

@ -0,0 +1,47 @@
import * as Blockly from "blockly/core";
import { getColour } from "../helpers/colour";
import { selectedBoard } from "../helpers/board";
Blockly.Blocks["init_serial_monitor"] = {
init: function () {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setColour(getColour().serial);
this.setHelpUrl("http://arduino.cc/en/Serial/Begin");
this.appendDummyInput()
.appendField(Blockly.Msg.ARD_SERIAL_SETUP)
.appendField(
new Blockly.FieldDropdown(selectedBoard().serial),
"SERIAL_ID"
)
.appendField(Blockly.Msg.ARD_SERIAL_SPEED)
.appendField(
new Blockly.FieldDropdown(selectedBoard().serialSpeed),
"SPEED"
)
.appendField(Blockly.Msg.ARD_SERIAL_BPS);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.ARD_SERIAL_SETUP_TIP);
},
};
Blockly.Blocks["print_serial_monitor"] = {
init: function () {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setColour(getColour().serial);
this.setHelpUrl("http://www.arduino.cc/en/Serial/Print");
this.appendDummyInput()
.appendField(
new Blockly.FieldDropdown(selectedBoard().serial),
"SERIAL_ID"
)
.appendField(Blockly.Msg.ARD_SERIAL_PRINT);
this.appendValueInput("CONTENT");
this.appendDummyInput()
.appendField(new Blockly.FieldCheckbox("TRUE"), "NEW_LINE")
.appendField(Blockly.Msg.ARD_SERIAL_PRINT_NEWLINE);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.ARD_SERIAL_PRINT_TIP);
},
};

View File

@ -8,123 +8,135 @@
* The arduino built in functions syntax can be found in * The arduino built in functions syntax can be found in
* http://arduino.cc/en/Reference/HomePage * http://arduino.cc/en/Reference/HomePage
*/ */
import Blockly from 'blockly'; import Blockly from "blockly";
import { getColour } from '../helpers/colour' import { getColour } from "../helpers/colour";
import * as Types from '../helpers/types' import * as Types from "../helpers/types";
Blockly.Blocks["time_delay"] = {
Blockly.Blocks['time_delay'] = { /**
/** * Delay block definition
* Delay block definition * @this Blockly.Block
* @this Blockly.Block */
*/ init: function () {
init: function () { this.setHelpUrl("http://arduino.cc/en/Reference/Delay");
this.setHelpUrl('http://arduino.cc/en/Reference/Delay'); this.setColour(getColour().time);
this.setColour(getColour().time); this.appendValueInput("DELAY_TIME_MILI")
this.appendValueInput('DELAY_TIME_MILI') .setCheck(Types.NUMBER.checkList)
.setCheck(Types.NUMBER.checkList) .appendField(Blockly.Msg.ARD_TIME_DELAY);
.appendField(Blockly.Msg.ARD_TIME_DELAY); this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MS);
this.appendDummyInput() this.setInputsInline(true);
.appendField(Blockly.Msg.ARD_TIME_MS); this.setPreviousStatement(true, null);
this.setInputsInline(true); this.setNextStatement(true, null);
this.setPreviousStatement(true, null); this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP);
this.setNextStatement(true, null); },
this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP);
}
}; };
Blockly.Blocks['time_delaymicros'] = { Blockly.Blocks["time_delaymicros"] = {
/** /**
* delayMicroseconds block definition * delayMicroseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/DelayMicroseconds'); this.setHelpUrl("http://arduino.cc/en/Reference/DelayMicroseconds");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendValueInput('DELAY_TIME_MICRO') this.appendValueInput("DELAY_TIME_MICRO")
.setCheck(Types.NUMBER.checkList) .setCheck(Types.NUMBER.checkList)
.appendField(Blockly.Msg.ARD_TIME_DELAY); .appendField(Blockly.Msg.ARD_TIME_DELAY);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS);
.appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS); this.setInputsInline(true);
this.setInputsInline(true); this.setPreviousStatement(true, null);
this.setPreviousStatement(true, null); this.setNextStatement(true, null);
this.setNextStatement(true, null); this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP); },
}
}; };
Blockly.Blocks['time_millis'] = { Blockly.Blocks["time_millis"] = {
/** /**
* Elapsed time in milliseconds block definition * Elapsed time in milliseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Millis'); this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MILLIS);
.appendField(Blockly.Msg.ARD_TIME_MILLIS); this.setOutput(true, Types.LARGE_NUMBER.typeName);
this.setOutput(true, Types.LARGE_NUMBER.typeId); this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP); },
}, /** @return {string} The type of return value for the block, an integer. */
/** @return {string} The type of return value for the block, an integer. */ getBlockType: function () {
getBlockType: function () { return Blockly.Types.LARGE_NUMBER;
return Blockly.Types.LARGE_NUMBER; },
}
}; };
Blockly.Blocks['time_micros'] = { Blockly.Blocks["time_micros"] = {
/** /**
* Elapsed time in microseconds block definition * Elapsed time in microseconds block definition
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl('http://arduino.cc/en/Reference/Micros'); this.setHelpUrl("http://arduino.cc/en/Reference/Micros");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MICROS);
.appendField(Blockly.Msg.ARD_TIME_MICROS); this.setOutput(true, Types.LARGE_NUMBER.typeName);
this.setOutput(true, Types.LARGE_NUMBER.typeId); this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP); },
}, /**
/** * Should be a long (32bit), but for for now an int.
* Should be a long (32bit), but for for now an int. * @return {string} The type of return value for the block, an integer.
* @return {string} The type of return value for the block, an integer. */
*/ getBlockType: function () {
getBlockType: function () { return Types.LARGE_NUMBER;
return Types.LARGE_NUMBER; },
}
}; };
Blockly.Blocks['infinite_loop'] = { Blockly.Blocks["infinite_loop"] = {
/** /**
* Waits forever, end of program. * Waits forever, end of program.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().time); this.setColour(getColour().time);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_INF);
.appendField(Blockly.Msg.ARD_TIME_INF); this.setInputsInline(true);
this.setInputsInline(true); this.setPreviousStatement(true);
this.setPreviousStatement(true); this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP);
this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP); },
}
}; };
Blockly.Blocks['sensebox_interval_timer'] = { // Blockly.Blocks["sensebox_interval_timer"] = {
init: function () { // init: function () {
this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip); // this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip);
this.setInputsInline(true); // this.setInputsInline(true);
this.setHelpUrl(''); // this.setHelpUrl("");
this.setColour(getColour().time); // this.setColour(getColour().time);
this.appendDummyInput() // this.appendDummyInput().appendField(Blockly.Msg.senseBox_interval_timer);
.appendField(Blockly.Msg.senseBox_interval_timer); // this.appendDummyInput()
this.appendDummyInput() // .setAlign(Blockly.ALIGN_LEFT)
.setAlign(Blockly.ALIGN_LEFT) // .appendField(new Blockly.FieldTextInput("10000"), "interval")
.appendField(new Blockly.FieldTextInput("10000"), "interval") // .appendField(Blockly.Msg.senseBox_interval);
.appendField(Blockly.Msg.senseBox_interval); // this.appendStatementInput("DO").setCheck(null);
this.appendStatementInput('DO') // this.setPreviousStatement(true, null);
.setCheck(null); // this.setNextStatement(true, null);
this.setPreviousStatement(true, null); // },
this.setNextStatement(true, null); // };
}
Blockly.Blocks["sensebox_interval_timer"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip);
this.setInputsInline(true);
this.setHelpUrl("");
this.setColour(getColour().time);
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_interval_timer)
.appendField(new Blockly.FieldTextInput("Interval"), "name");
this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_interval_time)
.setAlign(Blockly.ALIGN_LEFT)
.appendField(new Blockly.FieldTextInput("10000"), "interval")
.appendField(Blockly.Msg.senseBox_interval);
this.appendStatementInput("DO").setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
}; };

View File

@ -9,10 +9,10 @@ Blockly.Blocks["variables_set_dynamic"] = {
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.appendValueInput("VALUE") this.appendValueInput("VALUE")
.appendField("set", "set") .appendField(Blockly.Msg.variables_set, Blockly.Msg.variables_set)
.appendField("", "type") .appendField("", "type")
.appendField(new Blockly.FieldVariable("VAR"), "VAR") .appendField(new Blockly.FieldVariable("VAR"), "VAR")
.appendField("to"); .appendField(Blockly.Msg.variables_to);
}, },
onchange: function (e) { onchange: function (e) {
let variableID = this.getFieldValue("VAR"); let variableID = this.getFieldValue("VAR");

View File

@ -0,0 +1,28 @@
import Blockly from "blockly/core";
import { getColour } from "../helpers/colour";
Blockly.Blocks["watchdog_enable"] = {
init: function () {
this.appendDummyInput()
.appendField("Watchdog aktivieren")
.appendField(new Blockly.FieldTextInput("10000"), "TIME")
.appendField("ms");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().io);
this.setTooltip("");
this.setHelpUrl("");
},
};
Blockly.Blocks["watchdog_reset"] = {
init: function () {
this.appendDummyInput().appendField("Watchdog zurücksetzen");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().io);
this.setTooltip("");
this.setHelpUrl("");
},
};

View File

@ -0,0 +1,61 @@
import Blockly from "blockly";
/**
* starte/stoppe Pumpe
*
*/
Blockly.Arduino.CleVerLab_pump = function (block) {
var pin = block.getFieldValue('DigitalPin');
var state = block.getFieldValue("Mode");
Blockly['Arduino'].setupCode_['pinMode'] = 'pinMode(' + pin + ', OUTPUT);';
var code = 'digitalWrite(' + pin + ', ' + state + ');\n';
return code;
};
/**
* PH wert
*
*/
Blockly.Arduino.CleVerLab_temperature = function () {
var dropdown_pin = this.getFieldValue("DigitalPort");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["library_oneWire"] =
"#include <OneWire.h> // http://librarymanager/All#OneWire";
Blockly.Arduino.libraries_["library_oneDallasTemperature"] =
"#include <DallasTemperature.h> // http://librarymanager/All#DallasTemperature";
Blockly.Arduino.definitions_["define_OneWire"] =
"#define ONE_WIRE_BUS " +
dropdown_pin +
"\nOneWire oneWire(ONE_WIRE_BUS);\nDallasTemperature sensors(&oneWire);";
Blockly.Arduino.setupCode_["sensebox_oneWireSetup"] = "sensors.begin();";
Blockly.Arduino.codeFunctions_["sensebox_requestTemp"] =
"float getWaterTemp(){\nsensors.requestTemperatures();\nsensors.getTempCByIndex(0);\n}";
var code = "getWaterTemp()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.CleVerLab_pH = function () {
var dropdown_pin = this.getFieldValue("DigitalPin");
Blockly.Arduino.definitions_["define_pHgetter"] =
"#define SensorPin " + dropdown_pin +"\n#define samplingInterval 20\n#define printInterval 800\n#define ArrayLenth 40 //times of collection\nint pHArray[ArrayLenth]; //Store the average value of the sensor feedback\nint pHArrayIndex=0;\nfloat slope = 1.00;\nfloat b =0.00;";
Blockly.Arduino.codeFunctions_["sensebox_requestpH"] =
"float getpH(){\nstatic unsigned long samplingTime = millis();\nstatic unsigned long printTime = millis();\nstatic float pHValue,voltage;\n//nif(millis()-samplingTime > samplingInterval){\n//pHArray[pHArrayIndex++]=analogRead(SensorPin);\nfor (int i = 1; i <= 10; i += 1) {\nvoltage = voltage + analogRead(SensorPin);\n}\n voltage = (voltage / 10)*5.0/1024; \nsamplingTime=millis();\n\nreturn pHValue = 3.5*voltage*slope+b;\n}\n";
Blockly.Arduino.codeFunctions_["avergearraypH"] =
"double avergearray(int* arr, int number) {\n int i;\n int max, min;\n double avg;\n long amount = 0;\n if (number <= 0) {\n return 0;\n }\n if (number < 5) {\n for (i = 0; i < number; i++) {\n amount += arr[i];\n }\n avg = amount / number;\n return avg;\n }\n else {\n if (arr[0] < arr[1]) {\n min = arr[0];\n max = arr[1];\n }\n else {\n min = arr[1];\n max = arr[0];\n }\n for (i = 2; i < number; i++) {\n if (arr[i] < min) {\n amount += min;\n min = arr[i];\n }\n else {\n if (arr[i] > max) {\n amount += max;\n max = arr[i];\n }\n else {\n amount += arr[i];\n }\n }\n }\n avg = (double)amount / (number - 2);\n }\n return avg;\n}";
var code = "getpH()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.CleVerLab_cali1 = function () {
var var1 = Blockly.Arduino.valueToCode(this, 'VAR1', Blockly.Arduino.ORDER_ATOMIC) || "4.00";
var var2 = Blockly.Arduino.valueToCode(this, 'VAR2', Blockly.Arduino.ORDER_ATOMIC) || "7.00";
//var var1 = this.getFieldValue("VAR1");
//var var2 = this.getFieldValue("VAR2");
Blockly.Arduino.definitions_["define_pHKali"] = "#define pH4 4.00\n#define pH7 7.00\nfloat pH4is = "+ var1+";\nfloat pH7is = "+ var2 +";";
Blockly.Arduino.setupCode_["asdsadsa"] ="slope = (2.00-(4.00/3.50))/(pH7is/3.50 - pH4is/3.50);\n b = 7 - (pH7is * slope);";
var code = "0";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -26,6 +26,17 @@
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import store from "../../../store";
var ota = store.getState().general.platform
? store.getState().general.platform
: null;
store.subscribe(() => {
ota = store.getState().general.platform
? store.getState().general.platform
: null;
});
/** /**
* Arduino code generator. * Arduino code generator.
* @type !Blockly.Generator * @type !Blockly.Generator
@ -51,9 +62,7 @@ Blockly["Arduino"].addReservedWords(
"pulseIn,millis,micros,delay,delayMicroseconds,min,max,abs,constrain," + "pulseIn,millis,micros,delay,delayMicroseconds,min,max,abs,constrain," +
"map,pow,sqrt,sin,cos,tan,randomSeed,random,lowByte,highByte,bitRead," + "map,pow,sqrt,sin,cos,tan,randomSeed,random,lowByte,highByte,bitRead," +
"bitWrite,bitSet,bitClear,ultraSonicDistance,parseDouble,setNeoPixelColor," + "bitWrite,bitSet,bitClear,ultraSonicDistance,parseDouble,setNeoPixelColor," +
"bit,attachInterrupt,detachInterrupt,interrupts,noInterrupts", "bit,attachInterrupt,detachInterrupt,interrupts,noInterrupts,short,isBtnPressed"
"short",
"isBtnPressed"
); );
/** /**
@ -121,71 +130,25 @@ Blockly["Arduino"].init = function (workspace) {
Blockly["Arduino"].variablesInitCode_ = ""; Blockly["Arduino"].variablesInitCode_ = "";
if (!Blockly["Arduino"].variableDB_) { if (!Blockly["Arduino"].nameDB_) {
Blockly["Arduino"].variableDB_ = new Blockly.Names( Blockly["Arduino"].nameDB_ = new Blockly.Names(
Blockly["Arduino"].RESERVED_WORDS_ Blockly["Arduino"].RESERVED_WORDS_
); );
} else { } else {
Blockly["Arduino"].variableDB_.reset(); Blockly["Arduino"].nameDB_.reset();
} }
Blockly["Arduino"].variableDB_.setVariableMap(workspace.getVariableMap()); Blockly["Arduino"].nameDB_.setVariableMap(workspace.getVariableMap());
// We don't have developer variables for now // We don't have developer variables for now
// // Add developer variables (not created or named by the user). // // Add developer variables (not created or named by the user).
// var devVarList = Blockly.Variables.allDeveloperVariables(workspace); // var devVarList = Blockly.Variables.allDeveloperVariables(workspace);
// for (var i = 0; i < devVarList.length; i++) { // for (var i = 0; i < devVarList.length; i++) {
// defvars.push(Blockly['Arduino'].variableDB_.getName(devVarList[i], // defvars.push(Blockly['Arduino'].nameDB_.getName(devVarList[i],
// Blockly.Names.DEVELOPER_VARIABLE_TYPE)); // Blockly.Names.DEVELOPER_VARIABLE_TYPE));
// } // }
const doubleVariables = workspace.getVariablesOfType("Number");
let i = 0;
let variableCode = "";
for (i = 0; i < doubleVariables.length; i += 1) {
variableCode +=
"double " +
Blockly["Arduino"].variableDB_.getName(
doubleVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
" = 0; \n\n";
}
const stringVariables = workspace.getVariablesOfType("String");
for (i = 0; i < stringVariables.length; i += 1) {
variableCode +=
"String " +
Blockly["Arduino"].variableDB_.getName(
stringVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
' = ""; \n\n';
}
const booleanVariables = workspace.getVariablesOfType("Boolean");
for (i = 0; i < booleanVariables.length; i += 1) {
variableCode +=
"boolean " +
Blockly["Arduino"].variableDB_.getDistinctName(
booleanVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
" = false; \n\n";
}
const colourVariables = workspace.getVariablesOfType("Colour");
for (i = 0; i < colourVariables.length; i += 1) {
variableCode +=
"RGB " +
Blockly["Arduino"].variableDB_.getName(
colourVariables[i].getId(),
Blockly.Variables.NAME_TYPE
) +
" = {0, 0, 0}; \n\n";
}
Blockly["Arduino"].variablesInitCode_ = variableCode;
}; };
/** /**
@ -254,26 +217,49 @@ Blockly["Arduino"].finish = function (code) {
"\n}\n"; "\n}\n";
let loopCode = "\nvoid loop() { \n" + loopCodeOnce + code + "\n}\n"; let loopCode = "\nvoid loop() { \n" + loopCodeOnce + code + "\n}\n";
// only add OTA code if tablet mode is enabled
// Convert the definitions dictionary into a list. if (ota === true) {
code = code =
devVariables + devVariables +
"\n" + "\n" +
libraryCode + "#include <SenseBoxOTA.h>" +
"\n" + "\n" +
variablesCode + libraryCode +
"\n" + "\n" +
definitionsCode + variablesCode +
"\n" + "\n" +
codeFunctions + definitionsCode +
"\n" + "\n" +
Blockly["Arduino"].variablesInitCode_ + codeFunctions +
"\n" + "\n" +
functionsCode + Blockly["Arduino"].variablesInitCode_ +
"\n" + "\n" +
setupCode + functionsCode +
"\n" + "\n" +
loopCode; setupCode +
"\n" +
loopCode;
} else {
// Convert the definitions dictionary into a list.
code =
devVariables +
"\n" +
libraryCode +
"\n" +
variablesCode +
"\n" +
definitionsCode +
"\n" +
codeFunctions +
"\n" +
Blockly["Arduino"].variablesInitCode_ +
"\n" +
functionsCode +
"\n" +
setupCode +
"\n" +
loopCode;
}
// Clean up temporary data. // Clean up temporary data.
delete Blockly["Arduino"].definitions_; delete Blockly["Arduino"].definitions_;
@ -281,7 +267,7 @@ Blockly["Arduino"].finish = function (code) {
delete Blockly["Arduino"].loopCodeOnce_; delete Blockly["Arduino"].loopCodeOnce_;
delete Blockly["Arduino"].variablesInitCode_; delete Blockly["Arduino"].variablesInitCode_;
delete Blockly["Arduino"].libraries_; delete Blockly["Arduino"].libraries_;
Blockly["Arduino"].variableDB_.reset(); Blockly["Arduino"].nameDB_.reset();
return code; return code;
}; };

View File

@ -5,10 +5,12 @@ import "./sensebox-telegram";
import "./sensebox-osem"; import "./sensebox-osem";
import "./sensebox-web"; import "./sensebox-web";
import "./sensebox-display"; import "./sensebox-display";
import "./sensebox-motors";
import "./sensebox-lora"; import "./sensebox-lora";
import "./sensebox-led"; import "./sensebox-led";
import "./sensebox"; import "./sensebox";
import "./sensebox-rtc"; import "./sensebox-rtc";
import "./sensebox-ntp";
import "./sensebox-ble"; import "./sensebox-ble";
import "./sensebox-sd"; import "./sensebox-sd";
import "./mqtt"; import "./mqtt";
@ -19,7 +21,10 @@ import "./map";
import "./io"; import "./io";
import "./audio"; import "./audio";
import "./procedures"; import "./procedures";
import "./serial";
import "./time"; import "./time";
import "./variables"; import "./variables";
import "./lists"; import "./lists";
import "./watchdog";
import "./webserver"; import "./webserver";
import "./CleVerLab"

View File

@ -275,10 +275,15 @@ Blockly.Arduino["math_change"] = function (block) {
"DELTA", "DELTA",
Blockly.Arduino.ORDER_ADDITIVE Blockly.Arduino.ORDER_ADDITIVE
) || "0"; ) || "0";
var varName = Blockly.Arduino.variableDB_.getName( var id = block.getFieldValue("VAR")
block.getFieldValue("VAR"), const varName = Blockly.Variables.getVariable(
Blockly.Variables.NAME_TYPE Blockly.getMainWorkspace(),
); id
).name;
// var varName = Blockly.Arduino.nameDB_.getName(
// block.getFieldValue("VAR"),
// Blockly.Variables.NAME_TYPE
// );
return varName + " += " + argument0 + ";\n"; return varName + " += " + argument0 + ";\n";
}; };

View File

@ -1,52 +1,77 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
/** /**
* MQTT Blocks * MQTT Blocks
*/ */
let service; let service;
Blockly.Arduino.sensebox_mqtt_setup = function () { Blockly.Arduino.sensebox_mqtt_setup = function () {
var server = this.getFieldValue('server'); var server = this.getFieldValue("server");
var port = this.getFieldValue('port'); var port = this.getFieldValue("port");
var username = this.getFieldValue('username'); var username = this.getFieldValue("username");
var pass = this.getFieldValue('password'); var pass = this.getFieldValue("password");
service = this.getFieldValue('service'); service = this.getFieldValue("service");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_['library_adafruitmqtt'] = '#include "Adafruit_MQTT.h"'; Blockly.Arduino.libraries_["library_adafruitmqtt"] =
Blockly.Arduino.libraries_['library_adafruitmqttclient'] = '#include "Adafruit_MQTT_Client.h"'; '#include <Adafruit_MQTT.h> //http://librarymanager/All#Adafruit_MQTT_Library"';
Blockly.Arduino.definitions_['mqtt_server'] = '#define SERVER "' + server + '"'; Blockly.Arduino.libraries_["library_adafruitmqttclient"] =
Blockly.Arduino.definitions_['mqtt_port'] = '#define SERVERPORT ' + port + ''; '#include <Adafruit_MQTT_Client.h>';
Blockly.Arduino.definitions_['mqtt_username'] = '#define USERNAME "' + username + '"'; Blockly.Arduino.definitions_["mqtt_server"] =
Blockly.Arduino.definitions_['mqtt_pass'] = '#define PASS "' + pass + '"'; '#define SERVER "' + server + '"';
Blockly.Arduino.definitions_['wifi_client'] = 'WiFiClient client;'; Blockly.Arduino.definitions_["mqtt_port"] =
Blockly.Arduino.definitions_['mqtt_client'] = 'Adafruit_MQTT_Client mqtt(&client, SERVER, SERVERPORT, USERNAME, PASS);' "#define SERVERPORT " + port + "";
var code = ''; Blockly.Arduino.definitions_["mqtt_username"] =
return code; '#define USERNAME "' + username + '"';
Blockly.Arduino.definitions_["mqtt_pass"] =
'#define PASS "' + pass + '"';
Blockly.Arduino.definitions_["wifi_client"] = "WiFiClient client;";
Blockly.Arduino.definitions_["mqtt_client"] =
"Adafruit_MQTT_Client mqtt(&client, SERVER, SERVERPORT, USERNAME, PASS);";
var code = "";
return code;
}; };
Blockly.Arduino.sensebox_mqtt_publish = function (block) { Blockly.Arduino.sensebox_mqtt_publish = function (block) {
var feedname = this.getFieldValue('publishfeed'); var feedname = this.getFieldValue("publishfeed");
var res = feedname.split("/"); var res = feedname.split("/");
var feed_client = res[res.length - 1]; var feed_client = res[res.length - 1];
var value = Blockly.Arduino.valueToCode(this, 'value', Blockly.Arduino.ORDER_ATOMIC) || '"No Block connected"'; var value =
Blockly.Arduino.valueToCode(this, "value", Blockly.Arduino.ORDER_ATOMIC) ||
'"No Block connected"';
switch (service) { switch (service) {
case 'adafruitio': case "adafruitio":
Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");' Blockly.Arduino.definitions_["mqtt_" + feed_client + ""] =
break; "Adafruit_MQTT_Publish " +
case 'dioty': feed_client +
Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, "/"USERNAME"/' + feedname + '");' ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' +
break; feedname +
case 'custom': '");';
Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, "' + feedname + '");' break;
break; case "dioty":
default: Blockly.Arduino.definitions_["mqtt_" + feed_client + ""] =
break; "Adafruit_MQTT_Publish " +
feed_client +
' = Adafruit_MQTT_Publish(&mqtt, "/"USERNAME"/' +
feedname +
'");';
break;
case "custom":
Blockly.Arduino.definitions_["mqtt_" + feed_client + ""] =
"Adafruit_MQTT_Publish " +
feed_client +
' = Adafruit_MQTT_Publish(&mqtt, "' +
feedname +
'");';
break;
default:
break;
}
} //Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");'
Blockly.Arduino.codeFunctions_[
//Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Publish ' + feed_client + ' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' + feedname + '");' "mqtt_connect_function"
Blockly.Arduino.codeFunctions_['mqtt_connect_function'] = `// Function to connect and reconnect as necessary to the MQTT server. ] = `// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting. // Should be called in the loop function and it will take care if connecting.
void MQTT_connect() { void MQTT_connect() {
int8_t ret; int8_t ret;
@ -59,23 +84,34 @@ void MQTT_connect() {
delay(5000); // wait 5 seconds delay(5000); // wait 5 seconds
} }
}`; }`;
Blockly.Arduino.loopCodeOnce_['mqtt_connect'] = 'MQTT_connect();'; Blockly.Arduino.loopCodeOnce_["mqtt_connect"] = "MQTT_connect();";
var code = '' + feed_client + '.publish(' + value + ');'; var code = "" + feed_client + ".publish(" + value + ");";
return code return code;
}; };
Blockly.Arduino.sensebox_mqtt_subscribe = function (block) { Blockly.Arduino.sensebox_mqtt_subscribe = function (block) {
var feedname = this.getFieldValue('subscribefeed'); var feedname = this.getFieldValue("subscribefeed");
var x = 5, feed_client; var x = 5,
feed_client = feedname.substr(feedname.length - x, x); feed_client;
Blockly.Arduino.definitions_['mqtt_' + feed_client + ''] = 'Adafruit_MQTT_Subscribe ' + feed_client + '= Adafruit_MQTT_Subscribe(&mqtt,' + feedname + ');'; feed_client = feedname.substr(feedname.length - x, x);
Blockly.Arduino.codeFunctions_['mqtt_' + feed_client + 'callbackFunction'] = `void ` + feed_client + `Callback (double x){ Blockly.Arduino.definitions_["mqtt_" + feed_client + ""] =
"Adafruit_MQTT_Subscribe " +
feed_client +
"= Adafruit_MQTT_Subscribe(&mqtt," +
feedname +
");";
Blockly.Arduino.codeFunctions_["mqtt_" + feed_client + "callbackFunction"] =
`void ` +
feed_client +
`Callback (double x){
Serial.println(x); Serial.println(x);
}`; }`;
Blockly.Arduino.setupCode_['mqtt_' + feed_client + '_callback'] = '' + feed_client + '.setCallback(' + feed_client + 'Callback);'; Blockly.Arduino.setupCode_["mqtt_" + feed_client + "_callback"] =
Blockly.Arduino.setupCode_['mqtt_' + feed_client + '_subscribe'] = 'mqtt.subscribe(&' + feed_client + ');'; "" + feed_client + ".setCallback(" + feed_client + "Callback);";
Blockly.Arduino.loopCodeOnce_['mqtt_processPackages'] = 'mqtt.processPackets(10);'; Blockly.Arduino.setupCode_["mqtt_" + feed_client + "_subscribe"] =
var code = ''; "mqtt.subscribe(&" + feed_client + ");";
return code; Blockly.Arduino.loopCodeOnce_["mqtt_processPackages"] =
"mqtt.processPackets(10);";
var code = "";
return code;
}; };

View File

@ -1,5 +1,4 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
/** /**
* Code generator to add code into the setup() and loop() functions. * Code generator to add code into the setup() and loop() functions.
@ -7,121 +6,122 @@ import * as Blockly from 'blockly/core';
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['arduino_functions'] = function (block) { Blockly.Arduino["arduino_functions"] = function (block) {
// Edited version of Blockly.Generator.prototype.statementToCode // Edited version of Blockly.Generator.prototype.statementToCode
function statementToCodeNoTab(block, name) { function statementToCodeNoTab(block, name) {
var targetBlock = block.getInputTargetBlock(name); var targetBlock = block.getInputTargetBlock(name);
var code = Blockly.Arduino.blockToCode(targetBlock); var code = Blockly.Arduino.blockToCode(targetBlock);
if (typeof code != 'string') { if (typeof code != "string") {
throw new Error('Expecting code from statement block "' + targetBlock.type + '".'); throw new Error(
} 'Expecting code from statement block "' + targetBlock.type + '".'
return code; );
} }
return code;
}
var setupBranch = Blockly.Arduino.statementToCode(block, 'SETUP_FUNC'); var setupBranch = Blockly.Arduino.statementToCode(block, "SETUP_FUNC");
// //var setupCode = Blockly.Arduino.scrub_(block, setupBranch); No comment block // //var setupCode = Blockly.Arduino.scrub_(block, setupBranch); No comment block
if (setupBranch) { if (setupBranch) {
Blockly.Arduino.setupCode_['mainsetup'] = setupBranch; Blockly.Arduino.setupCode_["mainsetup"] = setupBranch;
} }
var loopBranch = statementToCodeNoTab(block, 'LOOP_FUNC'); var loopBranch = statementToCodeNoTab(block, "LOOP_FUNC");
//var loopcode = Blockly.Arduino.scrub_(block, loopBranch); No comment block //var loopcode = Blockly.Arduino.scrub_(block, loopBranch); No comment block
return loopBranch; return loopBranch;
}; };
Blockly.Arduino['procedures_defreturn'] = function (block) { Blockly.Arduino["procedures_defreturn"] = function (block) {
// Define a procedure with a return value. // Define a procedure with a return value.
const funcName = Blockly.Arduino.variableDB_.getName( const funcName = Blockly.Arduino.nameDB_.getName(
block.getFieldValue('NAME'), block.getFieldValue("NAME"),
Blockly.Procedures.NAME_TYPE Blockly.Procedures.NAME_TYPE
); );
const branch = Blockly.Arduino.statementToCode(block, 'STACK'); const branch = Blockly.Arduino.statementToCode(block, "STACK");
const returnType = block.getFieldValue('RETURN TYPE') || 'void'; const returnType = block.getFieldValue("RETURN TYPE") || "void";
let returnValue = let returnValue =
Blockly.Arduino.valueToCode(block, 'RETURN', Blockly.Arduino.ORDER_NONE) || Blockly.Arduino.valueToCode(block, "RETURN", Blockly.Arduino.ORDER_NONE) ||
''; "";
if (returnValue) { if (returnValue) {
returnValue = Blockly.Arduino.INDENT + 'return ' + returnValue + ';\n'; returnValue = Blockly.Arduino.INDENT + "return " + returnValue + ";\n";
} }
const args = []; const args = [];
for (let i = 0; i < block.argumentVarModels_.length; i++) { for (let i = 0; i < block.argumentVarModels_.length; i++) {
args[i] = args[i] =
translateType(block.argumentVarModels_[i].type) + translateType(block.argumentVarModels_[i].type) +
' ' + " " +
block.argumentVarModels_[i].name; block.argumentVarModels_[i].name;
} }
let code = let code =
translateType(returnType) + translateType(returnType) +
' ' + " " +
funcName + funcName +
'(' + "(" +
args.join(', ') + args.join(", ") +
') {\n' + ") {\n" +
branch + branch +
returnValue + returnValue +
'}'; "}";
code = Blockly.Arduino.scrub_(block, code); code = Blockly.Arduino.scrub_(block, code);
// Add % so as not to collide with helper functions in definitions list. // Add % so as not to collide with helper functions in definitions list.
Blockly.Arduino.functionNames_['%' + funcName] = code; Blockly.Arduino.functionNames_["%" + funcName] = code;
return null; return null;
}; };
function translateType(type) { function translateType(type) {
switch (type) { switch (type) {
case "int":
case 'int': return "int";
return 'int'; case "String":
case 'String': return "String";
return 'String'; case "void":
case 'void': return "void";
return 'void'; case "boolean":
case 'boolean': return "boolean";
return 'boolean'; case "float":
case 'float': return "float";
return 'float' default:
default: throw new Error("Invalid Parameter Type");
throw new Error('Invalid Parameter Type'); }
}
} }
Blockly.Arduino['procedures_defnoreturn'] = Blockly.Arduino["procedures_defnoreturn"] =
Blockly.Arduino['procedures_defreturn']; Blockly.Arduino["procedures_defreturn"];
Blockly.Arduino['procedures_callreturn'] = function (block) { Blockly.Arduino["procedures_callreturn"] = function (block) {
// Call a procedure with a return value. // Call a procedure with a return value.
const funcName = Blockly.Arduino.variableDB_.getName( const funcName = Blockly.Arduino.nameDB_.getName(
block.getFieldValue('NAME'), block.getFieldValue("NAME"),
Blockly.Procedures.NAME_TYPE Blockly.Procedures.NAME_TYPE
); );
const args = []; const args = [];
for (let i = 0; i < block.arguments_.length; i++) { for (let i = 0; i < block.arguments_.length; i++) {
args[i] = args[i] =
Blockly.Arduino.valueToCode( Blockly.Arduino.valueToCode(
block, block,
'ARG' + i, "ARG" + i,
Blockly.Arduino.ORDER_COMMA Blockly.Arduino.ORDER_COMMA
) || 'null'; ) || "null";
} }
const code = funcName + '(' + args.join(', ') + ')'; const code = funcName + "(" + args.join(", ") + ")";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino['procedures_callnoreturn'] = function (block) { Blockly.Arduino["procedures_callnoreturn"] = function (block) {
// Call a procedure with no return value. // Call a procedure with no return value.
const funcName = Blockly.Arduino.variableDB_.getName( const funcName = Blockly.Arduino.nameDB_.getName(
block.getFieldValue('NAME'), block.getFieldValue("NAME"),
Blockly.Procedures.NAME_TYPE Blockly.Procedures.NAME_TYPE
); );
const args = []; const args = [];
for (let i = 0; i < block.arguments_.length; i++) { for (let i = 0; i < block.arguments_.length; i++) {
args[i] = args[i] =
Blockly.Arduino.valueToCode( Blockly.Arduino.valueToCode(
block, block,
'ARG' + i, "ARG" + i,
Blockly.Arduino.ORDER_COMMA Blockly.Arduino.ORDER_COMMA
) || 'null'; ) || "null";
} }
return funcName + '(' + args.join(', ') + ');\n'; return funcName + "(" + args.join(", ") + ");\n";
}; };

View File

@ -2,9 +2,8 @@ import * as Blockly from "blockly/core";
Blockly.Arduino.sensebox_phyphox_init = function () { Blockly.Arduino.sensebox_phyphox_init = function () {
var name = this.getFieldValue("devicename"); var name = this.getFieldValue("devicename");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["phyphox_library"] = `#include <phyphoxBle.h>`; Blockly.Arduino.libraries_["phyphox_library"] = `#include <phyphoxBle.h>`;
Blockly.Arduino.libraries_["library_senseBoxMCU"] =
'#include "SenseBoxMCU.h"';
Blockly.Arduino.phyphoxSetupCode_[ Blockly.Arduino.phyphoxSetupCode_[
"phyphox_start" "phyphox_start"
] = `PhyphoxBLE::start("${name}");`; ] = `PhyphoxBLE::start("${name}");`;
@ -91,7 +90,9 @@ Blockly.Arduino.sensebox_phyphox_graph = function () {
code += `${label}.setUnitY("${unity}");\n`; code += `${label}.setUnitY("${unity}");\n`;
code += `${label}.setLabelX("${labelx}");\n`; code += `${label}.setLabelX("${labelx}");\n`;
code += `${label}.setLabelY("${labely}");\n`; code += `${label}.setLabelY("${labely}");\n`;
code += `${label}.setStyle("${style}");\n`; if (style === "dots"){
code += `${label}.setStyle("${style}");\n`;
}
code += `${label}.setChannel(${channelX}, ${channelY});\n`; code += `${label}.setChannel(${channelX}, ${channelY});\n`;
code += `firstView.addElement(${label});\n`; code += `firstView.addElement(${label});\n`;
return code; return code;
@ -100,7 +101,6 @@ Blockly.Arduino.sensebox_phyphox_graph = function () {
Blockly.Arduino.sensebox_phyphox_experiment_send = function () { Blockly.Arduino.sensebox_phyphox_experiment_send = function () {
var branch = Blockly.Arduino.statementToCode(this, "sendValues"); var branch = Blockly.Arduino.statementToCode(this, "sendValues");
var blocks = this.getDescendants(); var blocks = this.getDescendants();
console.log(blocks);
var count = 0; var count = 0;
if (blocks !== undefined) { if (blocks !== undefined) {
for (var i = 0; i < blocks.length; i++) { for (var i = 0; i < blocks.length; i++) {
@ -114,7 +114,6 @@ Blockly.Arduino.sensebox_phyphox_experiment_send = function () {
var string = ""; var string = "";
for (var j = 1; j <= count; j++) { for (var j = 1; j <= count; j++) {
console.log("append");
if (string === "") { if (string === "") {
string += `channel${j}`; string += `channel${j}`;
} else if (string !== "") { } else if (string !== "") {

View File

@ -1,45 +1,79 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
/*Display Blocks*/ /*Display Blocks*/
Blockly.Arduino.sensebox_display_beginDisplay = function () { Blockly.Arduino.sensebox_display_beginDisplay = function () {
Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>'; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.libraries_['library_wire'] = '#include <Wire.h>'; Blockly.Arduino.libraries_["library_wire"] = "#include <Wire.h>";
Blockly.Arduino.libraries_['library_AdafruitGFX'] = '#include <Adafruit_GFX.h>'; Blockly.Arduino.libraries_["library_AdafruitGFX"] =
Blockly.Arduino.libraries_['library_AdafruitSSD1306'] = '#include <Adafruit_SSD1306.h>'; "#include <Adafruit_GFX.h> // http://librarymanager/All#Adafruit_GFX_Library";
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_AdafruitSSD1306"] =
Blockly.Arduino.definitions_['define_display'] = '#define OLED_RESET 4\nAdafruit_SSD1306 display(OLED_RESET);'; "#include <Adafruit_SSD1306.h> // http://librarymanager/All#Adafruit_SSD1306";
Blockly.Arduino.setupCode_['sensebox_display_begin'] = 'senseBoxIO.powerI2C(true);\ndelay(2000);\ndisplay.begin(SSD1306_SWITCHCAPVCC, 0x3D);\ndisplay.display();\ndelay(100);\ndisplay.clearDisplay();'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
var code = ''; Blockly.Arduino.definitions_[
return code; "define_display_size"
] = `#define SCREEN_WIDTH 128\n#define SCREEN_HEIGHT 64`;
Blockly.Arduino.definitions_["define_display"] =
"#define OLED_RESET -1\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);";
Blockly.Arduino.setupCode_["sensebox_display_begin"] =
"senseBoxIO.powerI2C(true);\ndelay(2000);\ndisplay.begin(SSD1306_SWITCHCAPVCC, 0x3D);\ndisplay.display();\ndelay(100);\ndisplay.clearDisplay();";
var code = "";
return code;
}; };
Blockly.Arduino.sensebox_display_clearDisplay = function () { Blockly.Arduino.sensebox_display_clearDisplay = function () {
var code = 'display.clearDisplay();\n'; var code = "display.clearDisplay();\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_display_printDisplay = function () { Blockly.Arduino.sensebox_display_printDisplay = function () {
var x = this.getFieldValue('X'); var x = this.getFieldValue("X");
var y = this.getFieldValue('Y'); var y = this.getFieldValue("Y");
var printDisplay = Blockly.Arduino.valueToCode(this, 'printDisplay', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; var printDisplay =
var size = this.getFieldValue('SIZE'); Blockly.Arduino.valueToCode(
var color = this.getFieldValue('COLOR'); this,
var code = 'display.setCursor(' + x + ',' + y + ');\n'; "printDisplay",
code += 'display.setTextSize(' + size + ');\n'; Blockly.Arduino.ORDER_ATOMIC
code += 'display.setTextColor(' + color + ');\n'; ) || '"Keine Eingabe"';
code += 'display.println(' + printDisplay + ');\n'; var size = this.getFieldValue("SIZE");
return code; var color = this.getFieldValue("COLOR");
var code = "display.setCursor(" + x + "," + y + ");\n";
code += "display.setTextSize(" + size + ");\n";
code += "display.setTextColor(" + color + ");\n";
code += "display.println(" + printDisplay + ");\n";
return code;
}; };
Blockly.Arduino.sensebox_display_fastPrint = function () { Blockly.Arduino.sensebox_display_fastPrint = function () {
var title1 = Blockly.Arduino.valueToCode(this, 'Title1', Blockly.Arduino.ORDER_ATOMIC) || '0' var title1 =
var value1 = Blockly.Arduino.valueToCode(this, 'Value1', Blockly.Arduino.ORDER_ATOMIC); Blockly.Arduino.valueToCode(this, "Title1", Blockly.Arduino.ORDER_ATOMIC) ||
var dimension1 = Blockly.Arduino.valueToCode(this, 'Dimension1', Blockly.Arduino.ORDER_ATOMIC) || '0' "0";
var title2 = Blockly.Arduino.valueToCode(this, 'Title2', Blockly.Arduino.ORDER_ATOMIC) || '0' var value1 = Blockly.Arduino.valueToCode(
var value2 = Blockly.Arduino.valueToCode(this, 'Value2', Blockly.Arduino.ORDER_ATOMIC); this,
var dimension2 = Blockly.Arduino.valueToCode(this, 'Dimension2', Blockly.Arduino.ORDER_ATOMIC) || '0' "Value1",
Blockly.Arduino.codeFunctions_['sensebox_fastPrint'] = ` Blockly.Arduino.ORDER_ATOMIC
);
var dimension1 =
Blockly.Arduino.valueToCode(
this,
"Dimension1",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var title2 =
Blockly.Arduino.valueToCode(this, "Title2", Blockly.Arduino.ORDER_ATOMIC) ||
"0";
var value2 = Blockly.Arduino.valueToCode(
this,
"Value2",
Blockly.Arduino.ORDER_ATOMIC
);
var dimension2 =
Blockly.Arduino.valueToCode(
this,
"Dimension2",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
Blockly.Arduino.codeFunctions_["sensebox_fastPrint"] = `
void printOnDisplay(String title1, String measurement1, String unit1, String title2, String measurement2, String unit2) { void printOnDisplay(String title1, String measurement1, String unit1, String title2, String measurement2, String unit2) {
display.setCursor(0, 0); display.setCursor(0, 0);
@ -62,67 +96,141 @@ Blockly.Arduino.sensebox_display_fastPrint = function () {
display.setTextSize(1); display.setTextSize(1);
display.println(unit2); display.println(unit2);
} }
` `;
var code = ` printOnDisplay(${title1}, String(${value1}), ${dimension1}, ${title2}, String(${value2}), ${dimension2});\n`; var code = ` printOnDisplay(${title1}, String(${value1}), ${dimension1}, ${title2}, String(${value2}), ${dimension2});\n`;
return code; return code;
}; };
Blockly.Arduino.sensebox_display_show = function (block) { Blockly.Arduino.sensebox_display_show = function (block) {
var show = Blockly.Arduino.statementToCode(block, 'SHOW'); var show = Blockly.Arduino.statementToCode(block, "SHOW");
var code = ''; var code = "";
code += show; code += show;
code += 'display.display();\n'; code += "display.display();\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_display_plotDisplay = function () { Blockly.Arduino.sensebox_display_plotDisplay = function () {
var YLabel = Blockly.Arduino.valueToCode(this, 'YLabel', Blockly.Arduino.ORDER_ATOMIC) || 'Y' var YLabel =
var XLabel = Blockly.Arduino.valueToCode(this, 'XLabel', Blockly.Arduino.ORDER_ATOMIC) || 'X' Blockly.Arduino.valueToCode(this, "YLabel", Blockly.Arduino.ORDER_ATOMIC) ||
var Title = Blockly.Arduino.valueToCode(this, 'Title', Blockly.Arduino.ORDER_ATOMIC) || 'Title' "Y";
var XRange1 = Blockly.Arduino.valueToCode(this, 'XRange1', Blockly.Arduino.ORDER_ATOMIC) || '0' var XLabel =
var XRange2 = Blockly.Arduino.valueToCode(this, 'XRange2', Blockly.Arduino.ORDER_ATOMIC) || '0' Blockly.Arduino.valueToCode(this, "XLabel", Blockly.Arduino.ORDER_ATOMIC) ||
var YRange1 = Blockly.Arduino.valueToCode(this, 'YRange1', Blockly.Arduino.ORDER_ATOMIC) || '0' "X";
var YRange2 = Blockly.Arduino.valueToCode(this, 'YRange2', Blockly.Arduino.ORDER_ATOMIC) || '0' var Title =
var XTick = Blockly.Arduino.valueToCode(this, 'XTick', Blockly.Arduino.ORDER_ATOMIC) || '0' Blockly.Arduino.valueToCode(this, "Title", Blockly.Arduino.ORDER_ATOMIC) ||
var YTick = Blockly.Arduino.valueToCode(this, 'YTick', Blockly.Arduino.ORDER_ATOMIC) || '0' "Title";
var TimeFrame = Blockly.Arduino.valueToCode(this, 'TimeFrame', Blockly.Arduino.ORDER_ATOMIC) || '0' var XRange1 =
var plotDisplay = Blockly.Arduino.valueToCode(this, 'plotDisplay', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; Blockly.Arduino.valueToCode(
Blockly.Arduino.libraries_['library_plot'] = '#include <Plot.h>'; this,
Blockly.Arduino.definitions_['define_plot_class'] = 'Plot DataPlot(&display);\n'; "XRange1",
Blockly.Arduino.variables_['define_plot_class'] = 'const double TIMEFRAME = ' + TimeFrame + ';\n'; Blockly.Arduino.ORDER_ATOMIC
Blockly.Arduino.setupCode_['sensebox_plot_setup'] = 'DataPlot.setTitle(' + Title + ');\nDataPlot.setXLabel(' + XLabel + ');\nDataPlot.setYLabel(' + YLabel + ');\nDataPlot.setXRange(' + XRange1 + ',' + XRange2 + ');\nDataPlot.setYRange(' + YRange1 + ',' + YRange2 + ');\nDataPlot.setXTick(' + XTick + ');\nDataPlot.setYTick(' + YTick + ');\nDataPlot.setXPrecision(0);\nDataPlot.setYPrecision(0);\n'; ) || "0";
var code = 'DataPlot.clear();' var XRange2 =
code += 'double starttime = millis();\ndouble t = 0;\nwhile (t <= TIMEFRAME) {\nt = (millis() - starttime) / 1000.0;\nfloat value = ' + plotDisplay + ';\n'; Blockly.Arduino.valueToCode(
code += 'DataPlot.addDataPoint(t,value);\n}\n'; this,
return code; "XRange2",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var YRange1 =
Blockly.Arduino.valueToCode(
this,
"YRange1",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var YRange2 =
Blockly.Arduino.valueToCode(
this,
"YRange2",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var XTick =
Blockly.Arduino.valueToCode(this, "XTick", Blockly.Arduino.ORDER_ATOMIC) ||
"0";
var YTick =
Blockly.Arduino.valueToCode(this, "YTick", Blockly.Arduino.ORDER_ATOMIC) ||
"0";
var TimeFrame =
Blockly.Arduino.valueToCode(
this,
"TimeFrame",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var plotDisplay =
Blockly.Arduino.valueToCode(
this,
"plotDisplay",
Blockly.Arduino.ORDER_ATOMIC
) || '"Keine Eingabe"';
Blockly.Arduino.libraries_["library_plot"] = "#include <Plot.h>";
Blockly.Arduino.definitions_["define_plot_class"] =
"Plot DataPlot(&display);\n";
Blockly.Arduino.variables_["define_plot_class"] =
"const double TIMEFRAME = " + TimeFrame + ";\n";
Blockly.Arduino.setupCode_["sensebox_plot_setup"] =
"DataPlot.setTitle(" +
Title +
");\nDataPlot.setXLabel(" +
XLabel +
");\nDataPlot.setYLabel(" +
YLabel +
");\nDataPlot.setXRange(" +
XRange1 +
"," +
XRange2 +
");\nDataPlot.setYRange(" +
YRange1 +
"," +
YRange2 +
");\nDataPlot.setXTick(" +
XTick +
");\nDataPlot.setYTick(" +
YTick +
");\nDataPlot.setXPrecision(0);\nDataPlot.setYPrecision(0);\n";
var code = "DataPlot.clear();";
code +=
"double starttime = millis();\ndouble t = 0;\nwhile (t <= TIMEFRAME) {\nt = (millis() - starttime) / 1000.0;\nfloat value = " +
plotDisplay +
";\n";
code += "DataPlot.addDataPoint(t,value);\n}\n";
return code;
}; };
Blockly.Arduino.sensebox_display_fillCircle = function () { Blockly.Arduino.sensebox_display_fillCircle = function () {
let code = ''; let code = "";
var x = Blockly.Arduino.valueToCode(this, 'X', Blockly.Arduino.ORDER_ATOMIC) || '0' var x =
var y = Blockly.Arduino.valueToCode(this, 'Y', Blockly.Arduino.ORDER_ATOMIC) || '0' Blockly.Arduino.valueToCode(this, "X", Blockly.Arduino.ORDER_ATOMIC) || "0";
var radius = Blockly.Arduino.valueToCode(this, 'Radius', Blockly.Arduino.ORDER_ATOMIC) || '0' var y =
var fill = this.getFieldValue('FILL'); Blockly.Arduino.valueToCode(this, "Y", Blockly.Arduino.ORDER_ATOMIC) || "0";
if (fill === 'TRUE') { var radius =
code = 'display.fillCircle(' + x + ',' + y + ',' + radius + ',1);\n'; Blockly.Arduino.valueToCode(this, "Radius", Blockly.Arduino.ORDER_ATOMIC) ||
} "0";
else { var fill = this.getFieldValue("FILL");
code = 'display.drawCircle(' + x + ',' + y + ',' + radius + ',1);\n'; if (fill === "TRUE") {
} code = "display.fillCircle(" + x + "," + y + "," + radius + ",1);\n";
return code; } else {
} code = "display.drawCircle(" + x + "," + y + "," + radius + ",1);\n";
}
return code;
};
Blockly.Arduino.sensebox_display_drawRectangle = function () { Blockly.Arduino.sensebox_display_drawRectangle = function () {
let code = ''; let code = "";
var x = Blockly.Arduino.valueToCode(this, 'X', Blockly.Arduino.ORDER_ATOMIC) || '0' var x =
var y = Blockly.Arduino.valueToCode(this, 'Y', Blockly.Arduino.ORDER_ATOMIC) || '0' Blockly.Arduino.valueToCode(this, "X", Blockly.Arduino.ORDER_ATOMIC) || "0";
var width = Blockly.Arduino.valueToCode(this, 'width', Blockly.Arduino.ORDER_ATOMIC) || '0' var y =
var height = Blockly.Arduino.valueToCode(this, 'height', Blockly.Arduino.ORDER_ATOMIC) || '0' Blockly.Arduino.valueToCode(this, "Y", Blockly.Arduino.ORDER_ATOMIC) || "0";
var fill = this.getFieldValue('FILL'); var width =
if (fill === 'TRUE') { Blockly.Arduino.valueToCode(this, "width", Blockly.Arduino.ORDER_ATOMIC) ||
code = 'display.fillRect(' + x + ',' + y + ',' + width + ',' + height + ',1);\n'; "0";
} var height =
else { Blockly.Arduino.valueToCode(this, "height", Blockly.Arduino.ORDER_ATOMIC) ||
code = 'display.drawRect(' + x + ',' + y + ',' + width + ',' + height + ',1);\n'; "0";
} var fill = this.getFieldValue("FILL");
return code; if (fill === "TRUE") {
} code =
"display.fillRect(" + x + "," + y + "," + width + "," + height + ",1);\n";
} else {
code =
"display.drawRect(" + x + "," + y + "," + width + "," + height + ",1);\n";
}
return code;
};

View File

@ -3,6 +3,7 @@ import * as Blockly from 'blockly/core';
Blockly.Arduino.sensebox_led = function () { Blockly.Arduino.sensebox_led = function () {
var dropdown_pin = this.getFieldValue('PIN'); var dropdown_pin = this.getFieldValue('PIN');
var dropdown_stat = this.getFieldValue('STAT'); var dropdown_stat = this.getFieldValue('STAT');
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.setupCode_['setup_led_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);'; Blockly.Arduino.setupCode_['setup_led_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
var code = 'digitalWrite(' + dropdown_pin + ',' + dropdown_stat + ');\n' var code = 'digitalWrite(' + dropdown_pin + ',' + dropdown_stat + ');\n'
return code; return code;
@ -11,6 +12,7 @@ Blockly.Arduino.sensebox_led = function () {
Blockly.Arduino.sensebox_rgb_led = function () { Blockly.Arduino.sensebox_rgb_led = function () {
var dropdown_pin = this.getFieldValue('PIN'); var dropdown_pin = this.getFieldValue('PIN');
var color = Blockly.Arduino.valueToCode(this, 'COLOR', Blockly.Arduino.ORDER_ATOMIC) || '0' var color = Blockly.Arduino.valueToCode(this, 'COLOR', Blockly.Arduino.ORDER_ATOMIC) || '0'
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_['define_rgb_led' + dropdown_pin] = '#include <Adafruit_NeoPixel.h>\n Adafruit_NeoPixel rgb_led_' + dropdown_pin + ' = Adafruit_NeoPixel(1,' + dropdown_pin + ',NEO_RGB + NEO_KHZ800);\n'; Blockly.Arduino.libraries_['define_rgb_led' + dropdown_pin] = '#include <Adafruit_NeoPixel.h>\n Adafruit_NeoPixel rgb_led_' + dropdown_pin + ' = Adafruit_NeoPixel(1,' + dropdown_pin + ',NEO_RGB + NEO_KHZ800);\n';
Blockly.Arduino.setupCode_['setup_rgb_led' + dropdown_pin] = 'rgb_led_' + dropdown_pin + '.begin();'; Blockly.Arduino.setupCode_['setup_rgb_led' + dropdown_pin] = 'rgb_led_' + dropdown_pin + '.begin();';
var code = 'rgb_led_' + dropdown_pin + '.setPixelColor(0,rgb_led_' + dropdown_pin + '.Color(' + color + '));\n'; var code = 'rgb_led_' + dropdown_pin + '.setPixelColor(0,rgb_led_' + dropdown_pin + '.Color(' + color + '));\n';
@ -23,6 +25,7 @@ Blockly.Arduino.sensebox_ws2818_led_init = function () {
var dropdown_pin = this.getFieldValue('Port'); var dropdown_pin = this.getFieldValue('Port');
var numPixel = Blockly.Arduino.valueToCode(this, 'NUMBER', Blockly.Arduino.ORDER_ATOMIC) || '1'; var numPixel = Blockly.Arduino.valueToCode(this, 'NUMBER', Blockly.Arduino.ORDER_ATOMIC) || '1';
var brightness = Blockly.Arduino.valueToCode(this, 'BRIGHTNESS', Blockly.Arduino.ORDER_ATOMIC) || '50' var brightness = Blockly.Arduino.valueToCode(this, 'BRIGHTNESS', Blockly.Arduino.ORDER_ATOMIC) || '50'
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_rgb_led' + dropdown_pin] = `#include <Adafruit_NeoPixel.h>\n Adafruit_NeoPixel rgb_led_${dropdown_pin}= Adafruit_NeoPixel(${numPixel}, ${dropdown_pin},NEO_GRB + NEO_KHZ800);\n`; Blockly.Arduino.definitions_['define_rgb_led' + dropdown_pin] = `#include <Adafruit_NeoPixel.h>\n Adafruit_NeoPixel rgb_led_${dropdown_pin}= Adafruit_NeoPixel(${numPixel}, ${dropdown_pin},NEO_GRB + NEO_KHZ800);\n`;
Blockly.Arduino.setupCode_['setup_rgb_led' + dropdown_pin] = 'rgb_led_' + dropdown_pin + '.begin();\n'; Blockly.Arduino.setupCode_['setup_rgb_led' + dropdown_pin] = 'rgb_led_' + dropdown_pin + '.begin();\n';
Blockly.Arduino.setupCode_['setup_rgb_led_brightness' + dropdown_pin] = `rgb_led_${dropdown_pin}.setBrightness(${brightness});\n`; Blockly.Arduino.setupCode_['setup_rgb_led_brightness' + dropdown_pin] = `rgb_led_${dropdown_pin}.setBrightness(${brightness});\n`;
@ -30,6 +33,7 @@ Blockly.Arduino.sensebox_ws2818_led_init = function () {
}; };
Blockly.Arduino.sensebox_ws2818_led = function () { Blockly.Arduino.sensebox_ws2818_led = function () {
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
var dropdown_pin = this.getFieldValue('Port'); var dropdown_pin = this.getFieldValue('Port');
var position = Blockly.Arduino.valueToCode(this, 'POSITION', Blockly.Arduino.ORDER_ATOMIC) || '0'; var position = Blockly.Arduino.valueToCode(this, 'POSITION', Blockly.Arduino.ORDER_ATOMIC) || '0';
var color = Blockly.Arduino.valueToCode(this, 'COLOR', Blockly.Arduino.ORDER_ATOMIC) || '0' var color = Blockly.Arduino.valueToCode(this, 'COLOR', Blockly.Arduino.ORDER_ATOMIC) || '0'
@ -48,6 +52,7 @@ function hexToRgb(hex) {
} }
Blockly.Arduino['colour_picker'] = function (block) { Blockly.Arduino['colour_picker'] = function (block) {
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
const rgb = hexToRgb(block.getFieldValue('COLOUR')); const rgb = hexToRgb(block.getFieldValue('COLOUR'));
return [rgb.r + ', ' + rgb.g + ', ' + rgb.b, Blockly.Arduino.ORDER_ATOMIC]; return [rgb.r + ', ' + rgb.g + ', ' + rgb.b, Blockly.Arduino.ORDER_ATOMIC];
@ -58,6 +63,7 @@ Blockly.Arduino['colour_random'] = function (block) {
}; };
Blockly.Arduino['colour_rgb'] = function (block) { Blockly.Arduino['colour_rgb'] = function (block) {
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
const red = Blockly.Arduino.valueToCode(block, 'RED', Blockly.Arduino.ORDER_ATOMIC); const red = Blockly.Arduino.valueToCode(block, 'RED', Blockly.Arduino.ORDER_ATOMIC);
const green = Blockly.Arduino.valueToCode(block, 'GREEN', Blockly.Arduino.ORDER_ATOMIC); const green = Blockly.Arduino.valueToCode(block, 'GREEN', Blockly.Arduino.ORDER_ATOMIC);
const blue = Blockly.Arduino.valueToCode(block, 'BLUE', Blockly.Arduino.ORDER_ATOMIC); const blue = Blockly.Arduino.valueToCode(block, 'BLUE', Blockly.Arduino.ORDER_ATOMIC);

View File

@ -5,10 +5,10 @@ Blockly.Arduino.sensebox_lora_initialize_otaa = function (block) {
var appID = this.getFieldValue("APPID"); var appID = this.getFieldValue("APPID");
var appKey = this.getFieldValue("APPKEY"); var appKey = this.getFieldValue("APPKEY");
var interval = this.getFieldValue("INTERVAL"); var interval = this.getFieldValue("INTERVAL");
Blockly.Arduino.libraries_["library_senseBoxMCU"] = Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
'#include "SenseBoxMCU.h"';
Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>"; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.libraries_["library_lmic"] = "#include <lmic.h>"; Blockly.Arduino.libraries_["library_lmic"] =
"#include <lmic.h> // http://librarymanager/All#IBM_LMIC_framework";
Blockly.Arduino.libraries_["library_hal"] = "#include <hal/hal.h>"; Blockly.Arduino.libraries_["library_hal"] = "#include <hal/hal.h>";
Blockly.Arduino.definitions_["define_LoRaVariablesOTAA"] = ` Blockly.Arduino.definitions_["define_LoRaVariablesOTAA"] = `
static const u1_t PROGMEM APPEUI[8]= {${appID}}; static const u1_t PROGMEM APPEUI[8]= {${appID}};
@ -177,7 +177,8 @@ Blockly.Arduino.sensebox_send_lora_sensor_value = function (block) {
}; };
Blockly.Arduino.sensebox_lora_cayenne_send = function (block) { Blockly.Arduino.sensebox_lora_cayenne_send = function (block) {
Blockly.Arduino.libraries_["library_cayene"] = "#include <CayenneLPP.h>"; Blockly.Arduino.libraries_["library_cayene"] =
"#include <CayenneLPP.h> // http://librarymanager/All#CayenneLPP";
Blockly.Arduino.variables_["variable_cayenne"] = "CayenneLPP lpp(51);"; Blockly.Arduino.variables_["variable_cayenne"] = "CayenneLPP lpp(51);";
var lora_sensor_values = Blockly.Arduino.statementToCode(block, "DO"); var lora_sensor_values = Blockly.Arduino.statementToCode(block, "DO");
Blockly.Arduino.functionNames_["functions_do_send"] = ` Blockly.Arduino.functionNames_["functions_do_send"] = `
@ -278,8 +279,7 @@ Blockly.Arduino.sensebox_lora_initialize_abp = function (block) {
var appskey = this.getFieldValue("APPSKEY"); var appskey = this.getFieldValue("APPSKEY");
var devaddr = this.getFieldValue("DEVADDR"); var devaddr = this.getFieldValue("DEVADDR");
var interval = this.getFieldValue("INTERVAL"); var interval = this.getFieldValue("INTERVAL");
Blockly.Arduino.libraries_["library_senseBoxMCU"] = Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
'#include "SenseBoxMCU.h"';
Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>"; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.libraries_["library_lmic"] = "#include <lmic.h>"; Blockly.Arduino.libraries_["library_lmic"] = "#include <lmic.h>";
Blockly.Arduino.libraries_["library_hal"] = "#include <hal/hal.h>"; Blockly.Arduino.libraries_["library_hal"] = "#include <hal/hal.h>";
@ -525,3 +525,12 @@ Blockly.Arduino.sensebox_lora_cayenne_gps = function (block) {
var code = `lpp.addGPS(${channel}, ${lat}, ${lng}, ${alt});\n`; var code = `lpp.addGPS(${channel}, ${lat}, ${lng}, ${alt});\n`;
return code; return code;
}; };
Blockly.Arduino.sensebox_lora_cayenne_concentration = function (block) {
var value =
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
0;
var channel = this.getFieldValue("CHANNEL");
var code = `lpp.addConcentration(${channel}, ${value});\n`;
return code;
};

View File

@ -0,0 +1,77 @@
import * as Blockly from "blockly/core";
/**
* Servo Motor
*
*/
Blockly.Arduino.sensebox_motors_beginServoMotor = function () {
var pin = this.getFieldValue("pin");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["include_servo_motor"] = "#include <Servo.h>";
Blockly.Arduino.definitions_[`define_servo_motor_${pin}`] = `Servo servo_motor_${pin}; // servo Motor`;
Blockly.Arduino.setupCode_[`setup_servo_motor_${pin}`] = `servo_motor_${pin}.attach(${pin}); // attach servo motor to pin ${pin}`;
var code = "";
return code;
};
Blockly.Arduino.sensebox_motors_moveServoMotor = function () {
var pin = this.getFieldValue("pin");
var degrees = Blockly.Arduino.valueToCode(this, 'degrees', Blockly.Arduino.ORDER_ATOMIC) || "90";
var code = `servo_motor_${pin}.write(${degrees}); // move servo motor to ${degrees} degrees\n`;
return code;
};
/**
* I2C Motor Board
*
*/
Blockly.Arduino.sensebox_motors_I2CMotorBoard_begin = function () {
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["include_i2c_motor_board"] = "#include <Grove_I2C_Motor_Driver.h>";
Blockly.Arduino.definitions_["define_i2c_motor_board"] = `
#define I2C_MOTOR_BOARD_ADDRESS 0x0f // default I2C address of I2C Motor Board`;
Blockly.Arduino.setupCode_["setup_i2c_motor_board"] = `
Motor.begin(I2C_MOTOR_BOARD_ADDRESS); // Initialize I2C Motor Board`;
var code = "";
return code;
};
Blockly.Arduino.sensebox_motors_I2CMotorBoard_moveDCMotor = function () {
var motor = this.getFieldValue("motor");
var speed = Blockly.Arduino.valueToCode(this, 'speed', Blockly.Arduino.ORDER_ATOMIC) || "50";
var code = `Motor.speed(MOTOR${motor}, ${speed}); // set speed of motor\n`;
return code;
};
Blockly.Arduino.sensebox_motors_I2CMotorBoard_stopDCMotor = function () {
var motor = this.getFieldValue("motor");
var code = `Motor.stop(MOTOR${motor}); // stop motor\n`;
return code;
};
/**
* Stepper Motor
*/
Blockly.Arduino.sensebox_motors_beginStepperMotor = function () {
var in1 = this.getFieldValue("in1");
var in2 = this.getFieldValue("in2");
var in3 = this.getFieldValue("in3");
var in4 = this.getFieldValue("in4");
var rpm = this.getFieldValue("rpm");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["include_stepper_motor"] = "#include <Stepper.h>";
Blockly.Arduino.definitions_["define_stepper_motor"] = `
Stepper stepper_motor(2048, ${in1}, ${in2}, ${in3}, ${in4}); // stepper Motor with 2048 steps per rotation`;
Blockly.Arduino.setupCode_["setup_stepper_motor"] =
`stepper_motor.setSpeed(${rpm}); // speed in rotations per minute`;
var code = "";
return code;
};
Blockly.Arduino.sensebox_motors_moveStepperMotor = function () {
var steps = Blockly.Arduino.valueToCode(this, 'steps', Blockly.Arduino.ORDER_ATOMIC) || '2048';
var code = `stepper_motor.step(${steps}); // 2048 steps correspond to one rotation\n`;
return code;
};

View File

@ -0,0 +1,19 @@
import Blockly from "blockly";
Blockly.Arduino.sensebox_ntp_init = function () {
Blockly.Arduino.libraries_["WiFiUdp"] = `#include <WiFiUdp.h>`;
Blockly.Arduino.libraries_["NTPClient"] = `#include <NTPClient.h>`;
Blockly.Arduino.definitions_["WiFiUDP"] = `WiFiUDP ntpUDP;`;
Blockly.Arduino.definitions_["NTPClient"] = `NTPClient timeClient(ntpUDP);`;
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.setupCode_["timeclient.begin"] = `timeClient.begin();`;
Blockly.Arduino.setupCode_["timeclient.update"] = `timeClient.update();`;
var code = ``;
return code;
};
Blockly.Arduino.sensebox_ntp_get = function () {
var format = this.getFieldValue("dropdown");
var code = `timeClient.${format}()`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -1,66 +1,125 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/** /**
* Block send Data to the openSenseMap * Block send Data to the openSenseMap
*/ */
Blockly.Arduino.sensebox_send_to_osem = function (block) { Blockly.Arduino.sensebox_send_to_osem = function (block) {
var code = ''; var code = "";
var sensor_id = this.getFieldValue('SensorID'); var sensor_id = this.getFieldValue("SensorID");
var id = sensor_id.slice(-3).toUpperCase(); var id = sensor_id.slice(-3).toUpperCase();
var sensor_value = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; var sensor_value =
Blockly.Arduino.definitions_['SENSOR_ID' + id + ''] = 'const char SENSOR_ID' + id + '[] PROGMEM = "' + sensor_id + '";'; Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
code += 'addMeasurement(SENSOR_ID' + id + ',' + sensor_value + ');\n'; '"Keine Eingabe"';
Blockly.Arduino.definitions_["SENSOR_ID" + id + ""] =
"const char SENSOR_ID" + id + '[] PROGMEM = "' + sensor_id + '";';
code += "addMeasurement(SENSOR_ID" + id + "," + sensor_value + ");\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_osem_connection = function (Block) { Blockly.Arduino.sensebox_osem_connection = function (Block) {
var box_id = this.getFieldValue('BoxID'); var workspace = Blockly.getMainWorkspace();
var host = this.getFieldValue('host'); var wifi = false;
var branch = Blockly.Arduino.statementToCode(Block, 'DO'); var ethernet = false;
var access_token = this.getFieldValue('access_token'); if (workspace.getBlocksByType("sensebox_wifi").length > 0) {
wifi = true;
ethernet = false;
} else if (workspace.getBlocksByType("sensebox_ethernet").length > 0) {
ethernet = true;
wifi = false;
}
var box_id = this.getFieldValue("BoxID");
var branch = Blockly.Arduino.statementToCode(Block, "DO");
var access_token = this.getFieldValue("access_token");
var blocks = this.getDescendants(); var blocks = this.getDescendants();
var type = this.getFieldValue('type'); var type = this.getFieldValue("type");
var ssl = this.getFieldValue('SSL'); var ssl = this.getFieldValue("SSL");
var restart = this.getFieldValue("RESTART");
var port = 0; var port = 0;
var count = 0; var count = 0;
if (blocks !== undefined) { if (blocks !== undefined) {
for (var i = 0; i < blocks.length; i++) { for (var i = 0; i < blocks.length; i++) {
if (blocks[i].type === 'sensebox_send_to_osem') { if (blocks[i].type === "sensebox_send_to_osem") {
count++; count++;
} }
} }
} }
var num_sensors = count; var num_sensors = count;
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['num_sensors'] = 'static const uint8_t NUM_SENSORS = ' + num_sensors + ';' Blockly.Arduino.definitions_["num_sensors"] =
Blockly.Arduino.definitions_['SenseBoxID'] = 'const char SENSEBOX_ID [] PROGMEM = "' + box_id + '";'; "static const uint8_t NUM_SENSORS = " + num_sensors + ";";
Blockly.Arduino.definitions_['host'] = 'const char server [] PROGMEM =' + host + ';'; Blockly.Arduino.definitions_["SenseBoxID"] =
if (ssl === 'TRUE') { 'const char SENSEBOX_ID [] PROGMEM = "' + box_id + '";';
Blockly.Arduino.definitions_['WiFiSSLClient'] = 'WiFiSSLClient client;'; Blockly.Arduino.definitions_["host"] =
port = 443; 'const char server [] PROGMEM ="ingress.opensensemap.org";';
} else if (ssl === 'FALSE') { if (wifi === true) {
Blockly.Arduino.definitions_['WiFiClient'] = 'WiFiClient client;'; if (ssl === "TRUE") {
port = 80; Blockly.Arduino.libraries_["library_bearSSL"] =
} "#include <ArduinoBearSSL.h>";
Blockly.Arduino.libraries_["library_arduinoECC08"] =
"#include <ArduinoECCX08.h>";
Blockly.Arduino.definitions_["WiFiClient"] = "WiFiClient wifiClient;";
Blockly.Arduino.definitions_["BearSSLClient"] =
"BearSSLClient client(wifiClient);";
Blockly.Arduino.functionNames_["getTime"] = `unsigned long getTime() {
return WiFi.getTime();
}`;
Blockly.Arduino.setupCode_["initBearSSL"] =
"ArduinoBearSSL.onGetTime(getTime);";
port = 443;
} else if (ssl === "FALSE") {
Blockly.Arduino.definitions_["WiFiClient"] = "WiFiClient client;";
port = 80;
}
} else if (ethernet === true) {
if (ssl === "TRUE") {
Blockly.Arduino.libraries_["library_bearSSL"] =
"#include <ArduinoBearSSL.h>";
Blockly.Arduino.libraries_["library_arduinoECC08"] =
"#include <ArduinoECCX08.h>";
Blockly.Arduino.libraries_["library_ethernetUdp"] =
"#include <EthernetUdp.h>";
Blockly.Arduino.libraries_["library_NTPClient"] =
"#include <NTPClient.h>";
Blockly.Arduino.definitions_["EthernetClient"] =
"EthernetClient eclient;";
Blockly.Arduino.definitions_["BearSSLClient"] =
"BearSSLClient client(eclient);";
Blockly.Arduino.definitions_["EthernetUDP"] = "EthernetUDP Udp;";
Blockly.Arduino.definitions_["NTPClient"] = "NTPClient timeClient(Udp);";
Blockly.Arduino.functionNames_["getTime"] = `
unsigned long getTime() {
timeClient.update();
return timeClient.getEpochTime();
}`;
Blockly.Arduino.definitions_['measurement'] = `typedef struct measurement { Blockly.Arduino.setupCode_["timeClient_begin"] = "timeClient.begin();";
Blockly.Arduino.setupCode_["initBearSSL"] =
"ArduinoBearSSL.onGetTime(getTime);";
port = 443;
} else if (ssl === "FALSE") {
Blockly.Arduino.definitions_["EthernetClient"] = "EthernetClient client;";
port = 80;
}
}
Blockly.Arduino.definitions_["measurement"] = `typedef struct measurement {
const char *sensorId; const char *sensorId;
float value; float value;
} measurement;`; } measurement;`;
Blockly.Arduino.definitions_['buffer'] = 'char buffer[750];'; Blockly.Arduino.definitions_["buffer"] = "char buffer[750];";
Blockly.Arduino.definitions_['num_measurement'] = `measurement measurements[NUM_SENSORS]; Blockly.Arduino.definitions_[
"num_measurement"
] = `measurement measurements[NUM_SENSORS];
uint8_t num_measurements = 0;`; uint8_t num_measurements = 0;`;
Blockly.Arduino.definitions_['lengthMultiplikator'] = 'const int lengthMultiplikator = 35;'; Blockly.Arduino.definitions_["lengthMultiplikator"] =
Blockly.Arduino.functionNames_['addMeasurement'] = ` "const int lengthMultiplikator = 35;";
Blockly.Arduino.functionNames_["addMeasurement"] = `
void addMeasurement(const char *sensorId, float value) { void addMeasurement(const char *sensorId, float value) {
measurements[num_measurements].sensorId = sensorId; measurements[num_measurements].sensorId = sensorId;
measurements[num_measurements].value = value; measurements[num_measurements].value = value;
num_measurements++; num_measurements++;
}`; }`;
if (type === 'Stationary') { if (type === "Stationary") {
Blockly.Arduino.functionNames_['writeMeasurementsToClient'] = ` Blockly.Arduino.functionNames_["writeMeasurementsToClient"] = `
void writeMeasurementsToClient() { void writeMeasurementsToClient() {
// iterate throug the measurements array // iterate throug the measurements array
for (uint8_t i = 0; i < num_measurements; i++) { for (uint8_t i = 0; i < num_measurements; i++) {
@ -72,18 +131,26 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
// reset num_measurements // reset num_measurements
num_measurements = 0; num_measurements = 0;
}`; }`;
Blockly.Arduino.functionNames_['submitValues'] = ` Blockly.Arduino.functionNames_["submitValues"] =
void submitValues() { `
void submitValues() {
${
wifi === true
? "if (WiFi.status() != WL_CONNECTED) {\nWiFi.disconnect();\ndelay(1000); // wait 1s\nWiFi.begin(ssid, pass);\ndelay(5000); // wait 5s\n}"
: ""
}
if (client.connected()) { if (client.connected()) {
client.stop(); client.stop();
delay(10); delay(1000);
} }
bool connected = false; bool connected = false;
char _server[strlen_P(server)]; char _server[strlen_P(server)];
strcpy_P(_server, server); strcpy_P(_server, server);
for (uint8_t timeout = 2; timeout != 0; timeout--) { for (uint8_t timeout = 2; timeout != 0; timeout--) {
Serial.println(F("connecting...")); Serial.println(F("connecting..."));
connected = client.connect(_server, `+ port + `); connected = client.connect(_server, ` +
port +
`);
if (connected == true) { if (connected == true) {
// construct the HTTP POST request: // construct the HTTP POST request:
sprintf_P(buffer, sprintf_P(buffer,
@ -105,22 +172,56 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
break; break;
} }
} }
while (client.available()) {
char c = client.read();
// if the server's disconnected, stop the client:
if (!client.connected()) {
client.stop();
break;
}
}
num_measurements = 0; num_measurements = 0;
break; break;
} }
delay(1000);
}
${
restart === "TRUE"
? "if (connected == false) {\n delay(5000);\n noInterrupts();\n NVIC_SystemReset();\n while (1)\n ;\n }"
: ""
} }
}`; }`;
var code = '';
var code = "";
code += branch; code += branch;
code += "submitValues();\n"; code += "submitValues();\n";
} } else if (type === "Mobile") {
else if (type === 'Mobile') { var lat = Blockly.Arduino.valueToCode(
var lat = Blockly.Arduino.valueToCode(Block, 'lat', Blockly.Arduino.ORDER_ATOMIC); Block,
var lng = Blockly.Arduino.valueToCode(Block, 'lng', Blockly.Arduino.ORDER_ATOMIC); "lat",
var timestamp = Blockly.Arduino.valueToCode(Block, 'timeStamp', Blockly.Arduino.ORDER_ATOMIC); Blockly.Arduino.ORDER_ATOMIC
var altitude = Blockly.Arduino.valueToCode(Block, 'altitude', Blockly.Arduino.ORDER_ATOMIC); );
Blockly.Arduino.definitions_['lengthMultiplikator'] = 'const int lengthMultiplikator = 77;'; var lng = Blockly.Arduino.valueToCode(
Blockly.Arduino.functionNames_['writeMeasurementsToClient'] = ` Block,
"lng",
Blockly.Arduino.ORDER_ATOMIC
);
var timestamp = Blockly.Arduino.valueToCode(
Block,
"timeStamp",
Blockly.Arduino.ORDER_ATOMIC
);
var altitude = Blockly.Arduino.valueToCode(
Block,
"altitude",
Blockly.Arduino.ORDER_ATOMIC
);
Blockly.Arduino.definitions_["lengthMultiplikator"] =
"const int lengthMultiplikator = 77;";
Blockly.Arduino.functionNames_["writeMeasurementsToClient"] = `
void writeMeasurementsToClient(float lat, float lng, float altitude, char* timeStamp) { void writeMeasurementsToClient(float lat, float lng, float altitude, char* timeStamp) {
// iterate throug the measurements array // iterate throug the measurements array
for (uint8_t i = 0; i < num_measurements; i++) { for (uint8_t i = 0; i < num_measurements; i++) {
@ -132,7 +233,10 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
// reset num_measurements // reset num_measurements
num_measurements = 0; num_measurements = 0;
}`; }`;
Blockly.Arduino.functionNames_['submitValues'] = ` Blockly.Arduino.variables_["latitude"] = "float latitude;";
Blockly.Arduino.variables_["longitude"] = "float longitude;";
Blockly.Arduino.functionNames_["submitValues"] =
`
void submitValues(float lat, float lng, float altitude, char* timeStamp) { void submitValues(float lat, float lng, float altitude, char* timeStamp) {
if (client.connected()) { if (client.connected()) {
client.stop(); client.stop();
@ -143,7 +247,9 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
strcpy_P(_server, server); strcpy_P(_server, server);
for (uint8_t timeout = 2; timeout != 0; timeout--) { for (uint8_t timeout = 2; timeout != 0; timeout--) {
Serial.println(F("connecting...")); Serial.println(F("connecting..."));
connected = client.connect(_server, `+ port + `); connected = client.connect(_server, ` +
port +
`);
if (connected == true) { if (connected == true) {
// construct the HTTP POST request: // construct the HTTP POST request:
sprintf_P(buffer, sprintf_P(buffer,
@ -165,15 +271,40 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
break; break;
} }
} }
while (client.available()) {
char c = client.read();
// if the server's disconnected, stop the client:
if (!client.connected()) {
client.stop();
break;
}
delay(1000);
}
num_measurements = 0; num_measurements = 0;
break; break;
} }
} }
}`
code = ''; ${
restart === "TRUE"
? "if (connected == false) {\n delay(5000);\n noInterrupts();\n NVIC_SystemReset();\n while (1)\n ;\n }"
: ""
}
}`;
code = "";
code += branch; code += branch;
code += 'submitValues(' + lat + ',' + lng + ',' + altitude + ',' + timestamp + ');\n'; code +=
"submitValues((" +
lat +
"/float(10000000)),(" +
lng +
"/float(10000000)),(" +
altitude +
"/float(100))," +
timestamp +
");\n";
} }
return code; return code;
}; };

View File

@ -3,8 +3,7 @@ import Blockly from "blockly";
Blockly.Arduino.sensebox_rtc_init = function () { Blockly.Arduino.sensebox_rtc_init = function () {
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`; Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
Blockly.Arduino.definitions_["RTC"] = `RV8523 rtc;`; Blockly.Arduino.definitions_["RTC"] = `RV8523 rtc;`;
Blockly.Arduino.libraries_["library_senseBoxMCU"] = Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
'#include "SenseBoxMCU.h"';
Blockly.Arduino.setupCode_["rtc.begin"] = `rtc.begin();`; Blockly.Arduino.setupCode_["rtc.begin"] = `rtc.begin();`;
var code = ``; var code = ``;
return code; return code;
@ -15,19 +14,22 @@ Blockly.Arduino.sensebox_rtc_set = function () {
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) || Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) ||
"0"; "0";
var minutes = var minutes =
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) || Blockly.Arduino.valueToCode(
"0"; this,
"minutes",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var hour = var hour =
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) || Blockly.Arduino.valueToCode(this, "hour", Blockly.Arduino.ORDER_ATOMIC) ||
"0"; "0";
var day = var day =
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) || Blockly.Arduino.valueToCode(this, "day", Blockly.Arduino.ORDER_ATOMIC) ||
"0"; "0";
var month = var month =
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) || Blockly.Arduino.valueToCode(this, "month", Blockly.Arduino.ORDER_ATOMIC) ||
"0"; "0";
var year = var year =
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) || Blockly.Arduino.valueToCode(this, "year", Blockly.Arduino.ORDER_ATOMIC) ||
"0"; "0";
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`; Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
Blockly.Arduino.setupCode_["rtc.start"] = `rtc.start();`; Blockly.Arduino.setupCode_["rtc.start"] = `rtc.start();`;
@ -79,18 +81,59 @@ Blockly.Arduino.sensebox_rtc_get_timestamp = function () {
Blockly.Arduino.setupCode_[ Blockly.Arduino.setupCode_[
"rtc.batterySwitchOver" "rtc.batterySwitchOver"
] = `rtc.batterySwitchOver(1);`; ] = `rtc.batterySwitchOver(1);`;
Blockly.Arduino.loopCodeOnce_[
"rtc_variables"
] = `uint8_t sec, min, hour, day, month;\nuint16_t year;`;
Blockly.Arduino.variables_["rtc_timestamp"] = `char timestamp[20];`; Blockly.Arduino.variables_["rtc_timestamp"] = `char timestamp[20];`;
Blockly.Arduino.loopCodeOnce_[ Blockly.Arduino.codeFunctions_["getTimeStamp"] = `
"rtc_get" char* getTimeStamp() {
] = `rtc.get(&sec, &min, &hour, &day, &month, &year);`; uint8_t sec, min, hour, day, month;
uint16_t year;
Blockly.Arduino.loopCodeOnce_[ rtc.get(&sec, &min, &hour, &day, &month, &year);
"" sprintf(timestamp, "%02d-%02d-%02dT%02d:%02d:%02dZ", year, month, day, hour, min, sec);
] = `sprintf(timestamp, "%02d-%02d-%02dT%02d:%02d:%02dZ", year, month, day, hour, min, sec);`; return timestamp;
}
var code = `timestamp`; `;
var code = `getTimeStamp()`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.sensebox_internal_rtc_init = function () {
Blockly.Arduino.libraries_["RTClib"] = `#include <RTCZero.h>`;
Blockly.Arduino.definitions_["RTC"] = `RTCZero rtc;`;
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.setupCode_["rtc.begin"] = `rtc.begin();`;
return "";
};
Blockly.Arduino.sensebox_internal_rtc_set = function () {
var branch =
Blockly.Arduino.valueToCode(this, "time", Blockly.Arduino.ORDER_ATOMIC) ||
"0";
Blockly.Arduino.setupCode_["rtc.setEpoch"] = `rtc.setEpoch(${branch});`;
var code = ``;
return code;
};
Blockly.Arduino.sensebox_internal_rtc_get = function () {
var dropdown = this.getFieldValue("dropdown");
var code = `rtc.get${dropdown}()`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.sensebox_internal_rtc_get_timestamp = function () {
Blockly.Arduino.variables_["rtc_timestamp"] = `char timestamp[20];`;
Blockly.Arduino.codeFunctions_["getTimeStamp"] = `
char* getTimeStamp() {
uint8_t sec, min, hour, day, month;
uint16_t year;
sec = rtc.getSeconds();
min = rtc.getMinutes();
hour = rtc.getHours();
day = rtc.getDay();
month = rtc.getMonth();
year = rtc.getYear();
sprintf(timestamp, "%02d-%02d-%02dT%02d:%02d:%02dZ", year, month, day, hour, min, sec);
return timestamp;
}
`;
var code = `getTimeStamp()`;
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };

View File

@ -1,5 +1,4 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/* SD-Card Blocks using the Standard SD Library*/ /* SD-Card Blocks using the Standard SD Library*/
/** /**
@ -10,45 +9,199 @@ import Blockly from 'blockly';
*/ */
Blockly.Arduino.sensebox_sd_create_file = function (block) { Blockly.Arduino.sensebox_sd_create_file = function (block) {
var filename = this.getFieldValue('Filename'); var filename = this.getFieldValue("Filename");
var res = filename.slice(0, 4); var extension = this.getFieldValue("extension");
Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>'; var newFileName = filename.concat(".", extension);
Blockly.Arduino.libraries_['library_sd'] = '#include <SD.h>'; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.definitions_['define_' + res] = 'File dataFile' + res + ';'; Blockly.Arduino.libraries_["library_sd"] = "#include <SD.h>";
Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; Blockly.Arduino.definitions_["define_" + filename] = `File ${filename};`;
Blockly.Arduino.setupCode_['sensebox_sd' + filename] = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\ndataFile' + res + '.close();\n'; Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);\n";
var code = ''; Blockly.Arduino.setupCode_[
return code; "sensebox_sd" + filename
] = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n${filename}.close();\n`;
var code = "";
return code;
}; };
Blockly.Arduino.sensebox_sd_open_file = function (block) { Blockly.Arduino.sensebox_sd_open_file = function (block) {
var filename = this.getFieldValue('Filename'); var filename = this.getFieldValue("Filename");
var res = filename.slice(0, 4); var extension = this.getFieldValue("extension");
var branch = Blockly.Arduino.statementToCode(block, 'SD'); var newFileName = filename.concat(".", extension);
var code = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\n' var branch = Blockly.Arduino.statementToCode(block, "SD");
code += branch; var code = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n`;
code += 'dataFile' + res + '.close();\n' code += branch;
return code; code += `${filename}.close();\n`;
return code;
}; };
Blockly.Arduino.sensebox_sd_write_file = function (block) { Blockly.Arduino.sensebox_sd_write_file = function (block) {
if (this.parentBlock_ != null) { if (this.parentBlock_ != null) {
var filename = this.getSurroundParent().getFieldValue('Filename'); var filename = this.getSurroundParent().getFieldValue("Filename");
} }
var res = filename.slice(0, 4); var branch =
var text = Blockly.Arduino.valueToCode(this, 'DATA', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; Blockly.Arduino.valueToCode(this, "DATA", Blockly.Arduino.ORDER_ATOMIC) ||
var linebreak = this.getFieldValue('linebreak'); '"Keine Eingabe"';
if (linebreak === "TRUE") { var linebreak = this.getFieldValue("linebreak");
linebreak = "ln"; if (linebreak === "TRUE") {
} else { linebreak = "ln";
linebreak = ""; } else {
} linebreak = "";
var code = ''; }
if (text === "gps.getLongitude()" || text === "gps.getLatitude()") { var code = "";
code = 'dataFile' + res + '.print' + linebreak + '(' + text + ',5);\n' if (branch === "gps.getLongitude()" || branch === "gps.getLatitude()") {
} code = `${filename}.print${linebreak}(${branch},5);\n`;
else { } else {
code = 'dataFile' + res + '.print' + linebreak + '(' + text + ');\n' code = `${filename}.print${linebreak}(${branch});\n`;
} }
return code; return code;
};
Blockly.Arduino.sensebox_sd_osem = function () {
if (this.parentBlock_ != null) {
var filename = this.getSurroundParent().getFieldValue("Filename");
}
var type = this.getFieldValue("type");
var blocks = this.getDescendants();
var branch = Blockly.Arduino.statementToCode(this, "DO");
var count = 0;
if (blocks !== undefined) {
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].type === "sensebox_sd_save_for_osem") {
count++;
}
}
}
var num_sensors = count;
var timestamp = Blockly.Arduino.valueToCode(
this,
"timeStamp",
Blockly.Arduino.ORDER_ATOMIC
);
Blockly.Arduino.definitions_["num_sensors"] =
"static const uint8_t NUM_SENSORS = " + num_sensors + ";";
Blockly.Arduino.definitions_["measurement"] = `typedef struct measurement {
const char *sensorId;
float value;
} measurement;`;
Blockly.Arduino.definitions_["buffer"] = "char buffer[750];";
Blockly.Arduino.definitions_[
"num_measurement"
] = `measurement measurements[NUM_SENSORS];
uint8_t num_measurements = 0;`;
if (type === "Stationary") {
Blockly.Arduino.functionNames_["addMeasurement"] = `
void addMeasurement(const char *sensorId, float value) {
measurements[num_measurements].sensorId = sensorId;
measurements[num_measurements].value = value;
num_measurements++;
}
`;
Blockly.Arduino.functionNames_["writeMeasurementsToSdCard"] = `
void writeMeasurementsToSdCard(char* timeStamp) {
// iterate throug the measurements array
for (uint8_t i = 0; i < num_measurements; i++) {
sprintf_P(buffer, PSTR("%s,%9.2f,%s"), measurements[i].sensorId, measurements[i].value, timeStamp);
// transmit buffer to client
${filename}.println(buffer);
}
// reset num_measurements
num_measurements = 0;
}
`;
Blockly.Arduino.functionNames_["saveValues"] = `
void saveValues() {
// send measurements
writeMeasurementsToSdCard(${timestamp});
num_measurements = 0;
}
`;
var code = "";
code += branch;
code += "saveValues();";
} else if (type === "Mobile") {
/**
* add mobile functions here
*/
Blockly.Arduino.libraries_["dtostrf.h"] = "#include <avr/dtostrf.h>";
var lat = Blockly.Arduino.valueToCode(
this,
"lat",
Blockly.Arduino.ORDER_ATOMIC
);
var lng = Blockly.Arduino.valueToCode(
this,
"lng",
Blockly.Arduino.ORDER_ATOMIC
);
// var altitude = Blockly.Arduino.valueToCode(
// this,
// "altitude",
// Blockly.Arduino.ORDER_ATOMIC
// );
Blockly.Arduino.definitions_["num_sensors"] =
"static const uint8_t NUM_SENSORS = " + num_sensors + ";";
Blockly.Arduino.definitions_["measurement"] = `typedef struct measurement {
const char *sensorId;
float value;
} measurement;`;
Blockly.Arduino.definitions_["buffer"] = "char buffer[750];";
Blockly.Arduino.definitions_[
"num_measurement"
] = `measurement measurements[NUM_SENSORS];
uint8_t num_measurements = 0;`;
Blockly.Arduino.functionNames_["addMeasurement"] = `
void addMeasurement(const char *sensorId, float value) {
measurements[num_measurements].sensorId = sensorId;
measurements[num_measurements].value = value;
num_measurements++;
}
`;
Blockly.Arduino.functionNames_["writeMeasurementsToSdCard"] = `
void writeMeasurementsToSdCard(char* timeStamp, int32_t latitudes, int32_t longitudes) {
// iterate throug the measurements array
for (uint8_t i = 0; i < num_measurements; i++) {
char lng[20];
char lat[20];
float longitude = longitudes / (float)10000000;
float latitude = latitudes / (float)10000000;
dtostrf(longitude, 8, 7, lng);
dtostrf(latitude, 8, 7, lat);
sprintf_P(buffer, PSTR("%s,%9.2f,%s,%02s,%02s"), measurements[i].sensorId, measurements[i].value, timeStamp, lng, lat);
// transmit buffer to client
${filename}.println(buffer);
}
// reset num_measurements
num_measurements = 0;
}
`;
Blockly.Arduino.functionNames_["saveValues"] = `
void saveValues() {
// send measurements
writeMeasurementsToSdCard(${timestamp}, ${lat}, ${lng});
num_measurements = 0;
}
`;
code = "";
code += branch;
code += "saveValues();\n";
}
return code;
};
Blockly.Arduino.sensebox_sd_save_for_osem = function (block) {
var code = "";
var sensor_id = this.getFieldValue("SensorID");
var id = sensor_id.slice(-3).toUpperCase();
var sensor_value =
Blockly.Arduino.valueToCode(block, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
'"Keine Eingabe"';
Blockly.Arduino.definitions_["SENSOR_ID" + id + ""] =
"const char SENSOR_ID" + id + '[] PROGMEM = "' + sensor_id + '";';
code += "addMeasurement(SENSOR_ID" + id + "," + sensor_value + ");\n";
return code;
}; };

View File

@ -1,123 +1,234 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/** /**
* HDC1080 Temperature and Humidity Sensor * HDC1080 Temperature and Humidity Sensor
* *
*/ */
Blockly.Arduino.sensebox_sensor_temp_hum = function () { Blockly.Arduino.sensebox_sensor_temp_hum = function () {
var dropdown_name = this.getFieldValue('NAME'); var dropdown_name = this.getFieldValue("NAME");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
Blockly.Arduino.definitions_['define_hdc'] = 'HDC1080 hdc;'; Blockly.Arduino.libraries_["library_adafruithdc1000"] =
Blockly.Arduino.setupCode_['sensebox_sensor_temp_hum'] = 'hdc.begin();'; "#include <Adafruit_HDC1000.h> // http://librarymanager/All#Adafruit_HDC1000_Library";
var code = 'hdc.get' + dropdown_name + '()'; Blockly.Arduino.definitions_["define_hdc"] =
"Adafruit_HDC1000 hdc = Adafruit_HDC1000();";
Blockly.Arduino.setupCode_["sensebox_sensor_temp_hum"] = "hdc.begin();";
var code = `hdc.read${dropdown_name}()`;
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* VEML 6070 and TSL4513 UV-Light/Illuminance Sensor * VEML 6070 and TSL4513 UV-Light/Illuminance Sensor
* *
*/ */
Blockly.Arduino.sensebox_sensor_uv_light = function () { Blockly.Arduino.sensebox_sensor_uv_light = function () {
var dropdown_name = this.getFieldValue('NAME'); var dropdown_name = this.getFieldValue("NAME");
let code = ''; let code = "";
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
if (dropdown_name === 'UvIntensity') {
Blockly.Arduino.definitions_['define_veml'] = 'VEML6070 veml;' if (dropdown_name === "UvIntensity") {
Blockly.Arduino.setupCode_['sensebox_sensor_uv_light'] = 'veml.begin();' Blockly.Arduino.libraries_["library_veml6070"] = "#include <VEML6070.h>";
code = 'veml.get' + dropdown_name + '()'; Blockly.Arduino.definitions_["define_veml"] = "VEML6070 veml;";
Blockly.Arduino.setupCode_["sensebox_sensor_uv_light"] = "veml.begin();";
code = "veml.getUV()";
} }
// if (dropdown_name === 'Illuminance') { if (dropdown_name === "Illuminance") {
// Blockly.Arduino.definitions_['define_tsl'] = 'TSL45315 tsl;' Blockly.Arduino.libraries_["library_ltr329"] = `#include <LTR329.h>`;
// Blockly.Arduino.setupCode_['sensebox_sensor_illuminance'] = 'tsl.begin();' Blockly.Arduino.libraries_["library_wire"] = "#include <Wire.h>";
// code = 'tsl.get' + dropdown_name + '()'; Blockly.Arduino.codeFunctions_["read_reg"] = `
// } int read_reg(byte address, uint8_t reg)
if (dropdown_name === 'Illuminance') { {
Blockly.Arduino.definitions_['define_lightsensor'] = 'Lightsensor lightsensor;' int i = 0;
Blockly.Arduino.setupCode_['sensebox_sensor_illuminance'] = 'lightsensor.begin();' Wire.beginTransmission(address);
code = 'lightsensor.get' + dropdown_name + '()'; Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom((uint8_t)address, (uint8_t)1);
delay(1);
if(Wire.available())
i = Wire.read();
return i;
}
`;
Blockly.Arduino.codeFunctions_["write_reg"] = `
void write_reg(byte address, uint8_t reg, uint8_t val)
{
Wire.beginTransmission(address);
Wire.write(reg);
Wire.write(val);
Wire.endTransmission();
}`;
Blockly.Arduino.codeFunctions_["Lightsensor_begin"] = `
void Lightsensor_begin()
{
Wire.begin();
unsigned int u = 0;
u = read_reg(0x29, 0x80 | 0x0A); //id register
if ((u & 0xF0) == 0xA0) // TSL45315
{
write_reg(0x29, 0x80 | 0x00, 0x03); //control: power on
write_reg(0x29, 0x80 | 0x01, 0x02); //config: M=4 T=100ms
delay(120);
lightsensortype = 0; //TSL45315
}
else
{
LTR.begin();
LTR.setControl(gain, false, false);
LTR.setMeasurementRate(integrationTime, measurementRate);
LTR.setPowerUp(); //power on with default settings
delay(10); //Wait 10 ms (max) - wakeup time from standby
lightsensortype = 1; //
}
}
`;
Blockly.Arduino.codeFunctions_["Lightsensor_getIlluminance"] = `
unsigned int Lightsensor_getIlluminance()
{
unsigned int lux = 0;
if (lightsensortype == 0) // TSL45315
{
unsigned int u = (read_reg(0x29, 0x80 | 0x04) << 0); //data low
u |= (read_reg(0x29, 0x80 | 0x05) << 8); //data high
lux = u * 4; // calc lux with M=4 and T=100ms
}
else if (lightsensortype == 1) //LTR-329ALS-01
{
delay(100);
unsigned int data0, data1;
for (int i = 0; i < 5; i++) {
if (LTR.getData(data0, data1)) {
if(LTR.getLux(gain, integrationTime, data0, data1, lux));
if(lux > 0) break;
else delay(10);
}
else {
byte error = LTR.getError();
}
}
}
return lux;
}
`;
Blockly.Arduino.definitions_["define_lightsensor"] = `
bool lightsensortype = 0; //0 for tsl - 1 for ltr
//settings for LTR sensor
LTR329 LTR;
unsigned char gain = 1;
unsigned char integrationTime = 0;
unsigned char measurementRate = 3;
`;
Blockly.Arduino.setupCode_["sensebox_sensor_illuminance"] =
"Lightsensor_begin();";
code = "Lightsensor_getIlluminance()";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* BMX055 Accelerometer * BMX055 Accelerometer
* *
*/ */
Blockly.Arduino.sensebox_sensor_bmx055_accelerometer = function () { Blockly.Arduino.sensebox_sensor_bmx055_accelerometer = function () {
var dropdown_value = this.getFieldValue('VALUE'); var dropdown_value = this.getFieldValue("VALUE");
var range = this.getFieldValue('RANGE'); var range = this.getFieldValue("RANGE");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_bmx'] = 'BMX055 bmx;'; Blockly.Arduino.libraries_["library_bmx055"] = `#include <BMX055.h>`;
Blockly.Arduino.setupCode_['sensebox_sensor_bmx055'] = 'bmx.beginAcc(' + range + ');'; Blockly.Arduino.definitions_["define_bmx"] = "BMX055 bmx;";
var code = 'bmx.getAcceleration' + dropdown_value + '()'; Blockly.Arduino.setupCode_["sensebox_sensor_bmx055"] =
"bmx.beginAcc(" + range + ");";
var code = "bmx.getAcceleration" + dropdown_value + "()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* SDS011 Fine Particlar Matter * SDS011 Fine Particlar Matter
* *
*/ */
Blockly.Arduino.sensebox_sensor_sds011 = function () { Blockly.Arduino.sensebox_sensor_sds011 = function () {
var dropdown_name = this.getFieldValue('NAME'); var dropdown_name = this.getFieldValue("NAME");
var serial_name = this.getFieldValue('SERIAL'); var serial_name = this.getFieldValue("SERIAL");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.codeFunctions_['define_sds011'] = 'SDS011 my_sds(' + serial_name + ');'; Blockly.Arduino.libraries_[
Blockly.Arduino.variables_['variables_sds011'] = 'float p10,p25;\n'; "SdsDustSensor"
Blockly.Arduino.setupCode_['sensebox_sensor_sds011'] = serial_name + '.begin(9600);'; ] = `#include <SdsDustSensor.h> // http://librarymanager/All#Nova_Fitness_Sds_dust_sensors_library`;
var code = 'my_sds.get' + dropdown_name + '()'; Blockly.Arduino.definitions_["define_sds011"] =
"SdsDustSensor sds(" + serial_name + ");";
Blockly.Arduino.setupCode_["sds011_begin"] = "sds.begin();";
Blockly.Arduino.setupCode_["sds011_setQueryReportingMode"] =
"sds.setQueryReportingMode();";
Blockly.Arduino.loopCodeOnce_[
"sds011_getData"
] = `PmResult pm = sds.queryPm();`;
var code = `pm.${dropdown_name}`;
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* BMP280 Pressure Sensor * BMP280 Pressure Sensor
* *
*/ */
Blockly.Arduino.sensebox_sensor_pressure = function () { Blockly.Arduino.sensebox_sensor_pressure = function () {
var dropdown_name = this.getFieldValue('NAME'); var dropdown_name = this.getFieldValue("NAME");
var code = ''; var code = "";
var referencePressure = this.getFieldValue('referencePressure'); var referencePressure = this.getFieldValue("referencePressure");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_pressure'] = 'BMP280 bmp_sensor;'; Blockly.Arduino.libraries_[
Blockly.Arduino.setupCode_['sensebox_bmp_sensor'] = 'bmp_sensor.begin();'; "adafruit_bmp280"
if (dropdown_name === 'Pressure' || dropdown_name === 'Temperature') { ] = `#include <Adafruit_BMP280.h> // http://librarymanager/All#Adafruit_BMP280_Library`;
code = 'bmp_sensor.get' + dropdown_name + '()'; Blockly.Arduino.definitions_["define_pressure"] = "Adafruit_BMP280 bmp;";
} Blockly.Arduino.setupCode_["sensebox_bmp_sensor"] = "bmp.begin(0x76);";
else if (dropdown_name === 'Altitude') { Blockly.Arduino.setupCode_["bmp_setSampling"] = `
code = 'bmp_sensor.getAltitude(' + referencePressure + ')'; bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
`;
switch (dropdown_name) {
case "Temperature":
code = "bmp.readTemperature()";
break;
case "Pressure":
code = "bmp.readPressure()/100";
break;
case "Altitude":
code = "bmp.readAltitude(" + referencePressure + ")";
break;
default:
code = "";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* BME680 Environmental Sensor * BME680 Environmental Sensor
* *
*/ */
Blockly.Arduino.sensebox_sensor_bme680_bsec = function () { Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
var dropdown_name = this.getFieldValue('dropdown'); var dropdown_name = this.getFieldValue("dropdown");
let code = ''; let code = "";
Blockly.Arduino.libraries_['library_bsec'] = '#include "bsec.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['bsec_iaqSensor'] = 'Bsec iaqSensor;' Blockly.Arduino.libraries_["library_bsec"] =
Blockly.Arduino.variables_['bmeTemperatur'] = 'float bmeTemperatur;'; "#include <bsec.h> // http://librarymanager/All#BSEC_Software_Library";
Blockly.Arduino.variables_['bmeHumidity'] = 'float bmeHumidity;'; Blockly.Arduino.definitions_["bsec_iaqSensor"] = "Bsec iaqSensor;";
Blockly.Arduino.variables_['bmePressure'] = 'double bmePressure;'; Blockly.Arduino.variables_["bmeTemperatur"] = "float bmeTemperatur;";
Blockly.Arduino.variables_['bmeIAQ'] = 'float bmeIAQ;'; Blockly.Arduino.variables_["bmeHumidity"] = "float bmeHumidity;";
Blockly.Arduino.variables_['bmeIAQAccuracy'] = 'float bmeIAQAccuracy;'; Blockly.Arduino.variables_["bmePressure"] = "double bmePressure;";
Blockly.Arduino.variables_['bmeCO2'] = 'int bmeCO2;'; Blockly.Arduino.variables_["bmeIAQ"] = "float bmeIAQ;";
Blockly.Arduino.variables_['bmeBreathVocEquivalent'] = 'float bmeBreathVocEquivalent;' Blockly.Arduino.variables_["bmeIAQAccuracy"] = "float bmeIAQAccuracy;";
Blockly.Arduino.variables_["bmeCO2"] = "int bmeCO2;";
Blockly.Arduino.variables_["bmeBreathVocEquivalent"] =
"float bmeBreathVocEquivalent;";
Blockly.Arduino.functionNames_['checkIaqSensorStatus'] = ` Blockly.Arduino.functionNames_["checkIaqSensorStatus"] = `
void checkIaqSensorStatus(void) void checkIaqSensorStatus(void)
{ {
if (iaqSensor.status != BSEC_OK) { if (iaqSensor.status != BSEC_OK) {
@ -135,7 +246,7 @@ Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
} }
} }
`; `;
Blockly.Arduino.functionNames_['errLeds'] = ` Blockly.Arduino.functionNames_["errLeds"] = `
void errLeds(void) void errLeds(void)
{ {
pinMode(LED_BUILTIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT);
@ -145,10 +256,12 @@ Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
delay(100); delay(100);
}`; }`;
//Setup Code //Setup Code
Blockly.Arduino.setupCode_['Wire.begin'] = 'Wire.begin();'; Blockly.Arduino.setupCode_["Wire.begin"] = "Wire.begin();";
Blockly.Arduino.setupCode_['iaqSensor.begin'] = 'iaqSensor.begin(BME680_I2C_ADDR_PRIMARY, Wire);'; Blockly.Arduino.setupCode_["iaqSensor.begin"] =
Blockly.Arduino.setupCode_['checkIaqSensorStatus'] = 'checkIaqSensorStatus();'; "iaqSensor.begin(BME680_I2C_ADDR_PRIMARY, Wire);";
Blockly.Arduino.setupCode_['bsec_sensorlist'] = ` Blockly.Arduino.setupCode_["checkIaqSensorStatus"] =
"checkIaqSensorStatus();";
Blockly.Arduino.setupCode_["bsec_sensorlist"] = `
bsec_virtual_sensor_t sensorList[10] = { bsec_virtual_sensor_t sensorList[10] = {
BSEC_OUTPUT_RAW_TEMPERATURE, BSEC_OUTPUT_RAW_TEMPERATURE,
BSEC_OUTPUT_RAW_PRESSURE, BSEC_OUTPUT_RAW_PRESSURE,
@ -162,9 +275,10 @@ Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY, BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
}; };
`; `;
Blockly.Arduino.setupCode_['iaqSensorUpdateSubscription'] = 'iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);\ncheckIaqSensorStatus();'; Blockly.Arduino.setupCode_["iaqSensorUpdateSubscription"] =
"iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);\ncheckIaqSensorStatus();";
//Loop Code //Loop Code
Blockly.Arduino.loopCodeOnce_['iaqloop'] = ` Blockly.Arduino.loopCodeOnce_["iaqloop"] = `
if (iaqSensor.run()) { if (iaqSensor.run()) {
bmeTemperatur = iaqSensor.temperature; bmeTemperatur = iaqSensor.temperature;
bmeHumidity = iaqSensor.humidity; bmeHumidity = iaqSensor.humidity;
@ -178,26 +292,26 @@ Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
} }
`; `;
switch (dropdown_name) { switch (dropdown_name) {
case 'temperature': case "temperature":
code = 'bmeTemperatur'; code = "bmeTemperatur";
break; break;
case 'humidity': case "humidity":
code = 'bmeHumidity'; code = "bmeHumidity";
break; break;
case 'pressure': case "pressure":
code = 'bmePressure' code = "bmePressure";
break; break;
case 'IAQ': case "IAQ":
code = 'bmeIAQ'; code = "bmeIAQ";
break; break;
case 'IAQAccuracy': case "IAQAccuracy":
code = 'bmeIAQAccuracy'; code = "bmeIAQAccuracy";
break; break;
case 'CO2': case "CO2":
code = 'bmeCO2'; code = "bmeCO2";
break; break;
case 'breathVocEquivalent': case "breathVocEquivalent":
code = 'bmeBreathVocEquivalent'; code = "bmeBreathVocEquivalent";
break; break;
default: default:
break; break;
@ -205,109 +319,158 @@ Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* Ultrasonic Distance Sensor * Ultrasonic Distance Sensor
* *
*/ */
Blockly.Arduino.sensebox_sensor_ultrasonic_ranger = function () { Blockly.Arduino.sensebox_sensor_ultrasonic_ranger = function () {
var dropdown_pin_RX = this.getFieldValue('ultrasonic_trigger'); var dropdown_pin_RX = this.getFieldValue("ultrasonic_trigger");
var dropdown_pin_TX = this.getFieldValue('ultrasonic_echo'); var dropdown_pin_TX = this.getFieldValue("ultrasonic_echo");
var port = this.getFieldValue('port'); var port = this.getFieldValue("port");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; var maxDistance = this.getFieldValue("maxDistance");
Blockly.Arduino.definitions_['var_ultrasonic' + port] = 'Ultrasonic Ultrasonic' + port + '(' + dropdown_pin_RX + ',' + dropdown_pin_TX + ');'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_[
"library_newPing"
] = `#include <NewPing.h> // http://librarymanager/All#NewPing`;
Blockly.Arduino.variables_["define_newPingVariables" + port] = `
#define TRIGGER_PIN_${port} ${dropdown_pin_RX}
#define ECHO_PIN_${port} ${dropdown_pin_TX}
#define MAX_DISTANCE_${port} ${maxDistance}
`;
Blockly.Arduino.definitions_[
"define_newPing" + port
] = `NewPing sonar${port}(TRIGGER_PIN_${port}, ECHO_PIN_${port}, MAX_DISTANCE_${port});`;
var code; var code;
code = 'Ultrasonic' + port + '.getDistance()'; code = `sonar${port}.ping_cm()`;
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* Microphone * Microphone
* *
*/ */
Blockly.Arduino.sensebox_sensor_sound = function () { Blockly.Arduino.sensebox_sensor_sound = function () {
var dropdown_pin = this.getFieldValue('PIN'); var dropdown_pin = this.getFieldValue("PIN");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_microphone'] = 'Microphone microphone(' + dropdown_pin + ');' Blockly.Arduino.codeFunctions_["define_sound"] = `
var code = 'microphone.getValue()'; float getSoundValue(int pin) {
unsigned long start = millis(); // Start des Messintervalls
unsigned int peakToPeak = 0; // Abstand von maximalem zu minimalem Amplitudenausschlag
unsigned int signalMax = 0;
unsigned int signalMin = 1023;
const int sampleTime = 100;
unsigned int micValue;
// Sammle Daten für 100 Millisekunden
while (millis() - start < sampleTime)
{
micValue = analogRead(pin); // Messe den aktuellen Wert
if (micValue < 1023) // sortiere Fehlmessungen aus, deren Werte über dem max Wert 1024 liegen
{
if (micValue > signalMax)
{
signalMax = micValue; // speichere den maximal gemessenen Wert
}
else if (micValue < signalMin)
{
signalMin = micValue; // speichere den minimal gemessenen Wert
}
}
}
peakToPeak = signalMax - signalMin; // max - min = Abstand von maximalem zu minimalem Amplitudenausschlag
double volts = (peakToPeak * 5.0) / 1023; // wandle in Volt um
return volts;
}`;
var code = "getSoundValue(" + dropdown_pin + ")";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* Button * Button
* *
*/ */
Blockly.Arduino.sensebox_button = function () { Blockly.Arduino.sensebox_button = function () {
var dropdown_pin = this.getFieldValue('PIN'); var dropdown_pin = this.getFieldValue("PIN");
var dropown_function = this.getFieldValue('FUNCTION'); var dropown_function = this.getFieldValue("FUNCTION");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_button' + dropdown_pin + ''] = 'Button button_' + dropdown_pin + '(' + dropdown_pin + ');'; Blockly.Arduino.libraries_[
Blockly.Arduino.setupCode_['setup_button' + dropdown_pin + ''] = 'button_' + dropdown_pin + '.begin();'; "library_jcButtons"
var code = ''; ] = `#include <JC_Button.h> // http://librarymanager/All#JC_Button`;
if (dropown_function === 'isPressed') {
code = 'button_' + dropdown_pin + '.isPressed()'; Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
} "Button button_" + dropdown_pin + "(" + dropdown_pin + ");";
else if (dropown_function === 'Switch') { Blockly.Arduino.setupCode_["setup_button" + dropdown_pin + ""] =
code = 'button_' + dropdown_pin + '.getSwitch()'; "button_" + dropdown_pin + ".begin();";
} Blockly.Arduino.loopCodeOnce_["loop_button" + dropdown_pin + ""] =
else if (dropown_function === 'wasPressed') { "button_" + dropdown_pin + ".read();";
code = 'button_' + dropdown_pin + '.wasPressed()'; var code = "";
if (dropown_function === "isPressed") {
code = "button_" + dropdown_pin + ".isPressed()";
} else if (dropown_function === "wasPressed") {
code = "button_" + dropdown_pin + ".wasPressed()";
} else if (dropown_function === "longPress") {
var time = this.getFieldValue("time");
code = "button_" + dropdown_pin + ".pressedFor(" + time + ")";
} else if (dropown_function === "toggleButton") {
code = "button_" + dropdown_pin + ".toggleState()";
Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
"ToggleButton button_" + dropdown_pin + "(" + dropdown_pin + ");";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* SCD30 CO2 Sensor * SCD30 CO2 Sensor
* *
*/ */
Blockly.Arduino.sensebox_scd30 = function () { Blockly.Arduino.sensebox_scd30 = function () {
var dropdown = this.getFieldValue('dropdown'); var dropdown = this.getFieldValue("dropdown");
Blockly.Arduino.libraries_['scd30_library'] = '#include "SparkFun_SCD30_Arduino_Library.h"' Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["scd30_library"] =
Blockly.Arduino.definitions_['SCD30'] = 'SCD30 airSensor;'; "#include <SparkFun_SCD30_Arduino_Library.h> // http://librarymanager/All#SparkFun_SCD30_Arduino_Library";
Blockly.Arduino.setupCode_['init_scd30'] = ` Wire.begin(); Blockly.Arduino.definitions_["SCD30"] = "SCD30 airSensor;";
if (airSensor.begin() == false) Blockly.Arduino.setupCode_["init_scd30"] = ` Wire.begin();
{ if (airSensor.begin() == false)
while (1) {
; while (1)
}`; ;
var code = ''; }`;
Blockly.Arduino.setupCode_["scd30_staleData"] =
"airSensor.useStaleData(true);";
var code = "";
switch (dropdown) { switch (dropdown) {
case 'temperature': case "temperature":
code = 'airSensor.getTemperature()'; code = "airSensor.getTemperature()";
break; break;
case 'humidity': case "humidity":
code = 'airSensor.getHumiditiy()'; code = "airSensor.getHumidity()";
break; break;
case 'CO2': case "CO2":
code = 'airSensor.getCO2()'; code = "airSensor.getCO2()";
break; break;
default: default:
code = '' code = "";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
};
}
/** /**
* GPS Module * GPS Module
* *
*/ */
Blockly.Arduino.sensebox_gps = function () { Blockly.Arduino.sensebox_gps = function () {
var dropdown = this.getFieldValue('dropdown'); var dropdown = this.getFieldValue("dropdown");
Blockly.Arduino.libraries_['gps_library'] = '#include <SparkFun_u-blox_GNSS_Arduino_Library.h>' Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_['library_wire'] = '#include <Wire.h>'; Blockly.Arduino.libraries_["gps_library"] =
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; "#include <SparkFun_u-blox_GNSS_Arduino_Library.h> // http://librarymanager/All#SparkFun_u-blox_GNSS_Arduino_Library";
Blockly.Arduino.definitions_['GPS'] = 'SFE_UBLOX_GNSS myGNSS;'; Blockly.Arduino.libraries_["library_wire"] = "#include <Wire.h>";
Blockly.Arduino.setupCode_['init_gps'] = ` Wire.begin(); Blockly.Arduino.definitions_["GPS"] = "SFE_UBLOX_GNSS myGNSS;";
Blockly.Arduino.setupCode_["init_gps"] = ` Wire.begin();
if (myGNSS.begin() == false) //Connect to the Ublox module using Wire port if (myGNSS.begin() == false) //Connect to the Ublox module using Wire port
{ {
@ -317,95 +480,120 @@ Blockly.Arduino.sensebox_gps = function () {
myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise) myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)
myGNSS.saveConfiguration(); //Save the current settings to flash and BBR`; myGNSS.saveConfiguration(); //Save the current settings to flash and BBR`;
var code = ''; var code = "";
switch (dropdown) { switch (dropdown) {
case 'latitude': case "latitude":
code = 'myGNSS.getLatitude()'; code = "myGNSS.getLatitude()";
break; break;
case 'longitude': case "longitude":
code = 'myGNSS.getLongitude()'; code = "myGNSS.getLongitude()";
break; break;
case 'altitude': case "altitude":
code = 'myGNSS.getAltitudeMSL()'; code = "myGNSS.getAltitudeMSL()";
break; break;
case 'pDOP': case "pDOP":
code = 'myGNSS.getPDOP()'; code = "myGNSS.getPDOP()";
break; break;
case 'fixType': case "fixType":
code = 'myGNSS.getFixType()'; code = "myGNSS.getFixType()";
break;
case "timestamp":
Blockly.Arduino.variables_["timestampVars"] = `
char tsBuffer[21];
`;
Blockly.Arduino.codeFunctions_["getTimeStamp()"] = `
char* getTimeStamp()
{
if (myGNSS.getTimeValid() == true)
{
sprintf(tsBuffer, "%04d-%02d-%02dT%02d:%02d:%02dZ",
myGNSS.getYear(), myGNSS.getMonth(), myGNSS.getDay(), myGNSS.getHour(), myGNSS.getMinute(), myGNSS.getSecond());
}
return tsBuffer;
}
`;
code = "getTimeStamp()";
break;
case "speed":
code = "myGNSS.getGroundSpeed()";
break; break;
default: default:
code = '' code = "";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
};
}
/** /**
* Block for Truebner STM50 * Block for Truebner STM50
*/ */
Blockly.Arduino.sensebox_sensor_truebner_smt50 = function () { Blockly.Arduino.sensebox_sensor_truebner_smt50 = function () {
var dropdown_port = this.getFieldValue('Port') Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
var dropdown_value = this.getFieldValue('value'); var dropdown_port = this.getFieldValue("Port");
var dropdown_value = this.getFieldValue("value");
var dropdown_pin = 1; var dropdown_pin = 1;
var code = ''; var code = "";
if (dropdown_value === 'temp') { if (dropdown_value === "temp") {
if (dropdown_port === 'A') { if (dropdown_port === "A") {
dropdown_pin = 1; dropdown_pin = 1;
} }
if (dropdown_port === 'B') { if (dropdown_port === "B") {
dropdown_pin = 3; dropdown_pin = 3;
} }
if (dropdown_port === 'C') { if (dropdown_port === "C") {
dropdown_pin = 5; dropdown_pin = 5;
} }
Blockly.Arduino.codeFunctions_['sensebox_smt50_temp'] = 'float getSMT50Temperature(int analogPin){\n int sensorValue = analogRead(analogPin);\n float voltage = sensorValue * (3.3 / 1024.0);\n return (voltage - 0.5) * 100;\n}'; Blockly.Arduino.codeFunctions_["sensebox_smt50_temp"] =
code = 'getSMT50Temperature(' + dropdown_pin + ')'; "float getSMT50Temperature(int analogPin){\n int sensorValue = analogRead(analogPin);\n float voltage = sensorValue * (3.3 / 1024.0);\n return (voltage - 0.5) * 100;\n}";
code = "getSMT50Temperature(" + dropdown_pin + ")";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
} } else if (dropdown_value === "soil") {
else if (dropdown_value === 'soil') { if (dropdown_port === "A") {
if (dropdown_port === 'A') {
dropdown_pin = 2; dropdown_pin = 2;
} }
if (dropdown_port === 'B') { if (dropdown_port === "B") {
dropdown_pin = 4; dropdown_pin = 4;
} }
if (dropdown_port === 'C') { if (dropdown_port === "C") {
dropdown_pin = 6; dropdown_pin = 6;
} }
Blockly.Arduino.codeFunctions_['sensebox_smt50_soil'] = 'float getSMT50Moisture(int analogPin){\n int sensorValue = analogRead(analogPin);\n float voltage = sensorValue * (3.3 / 1024.0);\n return (voltage * 50) / 3;\n}'; Blockly.Arduino.codeFunctions_["sensebox_smt50_soil"] =
code = 'getSMT50Moisture(' + dropdown_pin + ')'; "float getSMT50Moisture(int analogPin){\n int sensorValue = analogRead(analogPin);\n float voltage = sensorValue * (3.3 / 1024.0);\n return (voltage * 50) / 3;\n}";
code = "getSMT50Moisture(" + dropdown_pin + ")";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
} }
}; };
/** /**
* DS18B20 Watertemperature * DS18B20 Watertemperature
* *
*/ */
Blockly.Arduino.sensebox_sensor_watertemperature = function () { Blockly.Arduino.sensebox_sensor_watertemperature = function () {
var dropdown_port = this.getFieldValue("Port");
var dropdown_port = this.getFieldValue('Port');
var dropdown_pin = 1; var dropdown_pin = 1;
if (dropdown_port === 'A') { if (dropdown_port === "A") {
dropdown_pin = 1; dropdown_pin = 1;
} }
if (dropdown_port === 'B') { if (dropdown_port === "B") {
dropdown_pin = 3; dropdown_pin = 3;
} }
if (dropdown_port === 'C') { if (dropdown_port === "C") {
dropdown_pin = 5; dropdown_pin = 5;
} }
Blockly.Arduino.libraries_['library_oneWire'] = '#include "OneWire.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_['library_oneDallasTemperature'] = '#include "DallasTemperature.h"'; Blockly.Arduino.libraries_["library_oneWire"] =
Blockly.Arduino.definitions_['define_OneWire'] = '#define ONE_WIRE_BUS ' + dropdown_pin + '\nOneWire oneWire(ONE_WIRE_BUS);\nDallasTemperature sensors(&oneWire);'; "#include <OneWire.h> // http://librarymanager/All#OneWire";
Blockly.Arduino.setupCode_['sensebox_oneWireSetup'] = 'sensors.begin();'; Blockly.Arduino.libraries_["library_oneDallasTemperature"] =
Blockly.Arduino.codeFunctions_['sensebox_requestTemp'] = 'float getWaterTemp(){\nsensors.requestTemperatures();\nsensors.getTempCByIndex(0);\n}'; "#include <DallasTemperature.h> // http://librarymanager/All#DallasTemperature";
var code = 'getWaterTemp()'; Blockly.Arduino.definitions_["define_OneWire"] =
"#define ONE_WIRE_BUS " +
dropdown_pin +
"\nOneWire oneWire(ONE_WIRE_BUS);\nDallasTemperature sensors(&oneWire);";
Blockly.Arduino.setupCode_["sensebox_oneWireSetup"] = "sensors.begin();";
Blockly.Arduino.codeFunctions_["sensebox_requestTemp"] =
"float getWaterTemp(){\nsensors.requestTemperatures();\nsensors.getTempCByIndex(0);\n}";
var code = "getWaterTemp()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
@ -443,28 +631,125 @@ float getWindspeed(){
*/ */
/** /**
* *
* *
*/ */
Blockly.Arduino.sensebox_soundsensor_dfrobot = function () { Blockly.Arduino.sensebox_soundsensor_dfrobot = function () {
var dropdown_port = this.getFieldValue('Port'); Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
var dropdown_port = this.getFieldValue("Port");
var dropdown_pin = 1; var dropdown_pin = 1;
if (dropdown_port === 'A') { if (dropdown_port === "A") {
dropdown_pin = 1; dropdown_pin = 1;
} }
if (dropdown_port === 'B') { if (dropdown_port === "B") {
dropdown_pin = 3; dropdown_pin = 3;
} }
if (dropdown_port === 'C') { if (dropdown_port === "C") {
dropdown_pin = 5; dropdown_pin = 5;
} }
Blockly.Arduino.codeFunctions_['soundsensor'] = ` Blockly.Arduino.codeFunctions_["soundsensor"] =
`
float getSoundValue(){ float getSoundValue(){
float v = analogRead(`+ dropdown_pin + `) * (3.3 / 1024.0); float v = analogRead(` +
dropdown_pin +
`) * (3.3 / 1024.0);
float decibel = v * 50; float decibel = v * 50;
return decibel; return decibel;
}` }`;
var code = 'getSoundValue()'; var code = "getSoundValue()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/**
* Infineon DPS310 Pressure Sensor
*
*/
Blockly.Arduino.sensebox_sensor_dps310 = function () {
var dropdown_name = this.getFieldValue("NAME");
var code = "";
var referencePressure = this.getFieldValue("referencePressure");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_[
"adafruit_dps310"
] = `#include <Adafruit_DPS310.h> // http://librarymanager/All#Adafruit_DPS310`;
Blockly.Arduino.definitions_["define_dps"] = "Adafruit_DPS310 dps;";
Blockly.Arduino.setupCode_["dps_begin"] = "dps.begin_I2C(0x76);";
Blockly.Arduino.setupCode_["dps_configuration"] = `
dps.configurePressure(DPS310_64HZ, DPS310_64SAMPLES);
dps.configureTemperature(DPS310_64HZ, DPS310_64SAMPLES);
`;
Blockly.Arduino.loopCodeOnce_["dps_events"] =
"sensors_event_t temp_event, pressure_event;";
Blockly.Arduino.loopCodeOnce_["dps_getEvents"] =
"dps.getEvents(&temp_event, &pressure_event);";
switch (dropdown_name) {
case "Temperature":
code = "temp_event.temperature";
break;
case "Pressure":
code = "pressure_event.pressure";
break;
case "Altitude":
code = "dps.readAltitude(" + referencePressure + ")";
break;
default:
code = "";
}
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
/**
* Sensirion SPS30 Fine Particlar Matter
*
*/
Blockly.Arduino.sensebox_sensor_sps30 = function () {
var dropdown_name = this.getFieldValue("value");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_[
"sps30"
] = `#include <sps30.h> // http://librarymanager/All#`;
Blockly.Arduino.variables_["sps30_measurement"] =
"struct sps30_measurement m;";
Blockly.Arduino.variables_["sps30_auto_clean_days"] =
"uint32_t auto_clean_days = 4;";
Blockly.Arduino.variables_["sps30_interval_intervalsps"] =
"const long intervalsps = 1000;";
Blockly.Arduino.variables_["sps30_time_startsps"] =
"unsigned long time_startsps = 0;";
Blockly.Arduino.variables_["sps30_time_actualsps"] =
"unsigned long time_actualsps = 0;";
Blockly.Arduino.codeFunctions_["sps30_getData"] = `
void getSPS30Data(){
uint16_t data_ready;
int16_t ret;
do {
ret = sps30_read_data_ready(&data_ready);
if (ret < 0) {
} else if (!data_ready) {}
else
break;
delay(100); /* retry in 100ms */
} while (1);
ret = sps30_read_measurement(&m);
}
`;
Blockly.Arduino.setupCode_["sps30_begin"] = "sensirion_i2c_init();";
Blockly.Arduino.setupCode_["sps30_setFanCleaningInterval"] =
"sps30_set_fan_auto_cleaning_interval_days(auto_clean_days);";
Blockly.Arduino.setupCode_["sps30_startMeasurement"] =
"sps30_start_measurement();";
Blockly.Arduino.loopCodeOnce_["getSPS30Data();"] = `
time_startsps = millis();
if (time_startsps > time_actualsps + intervalsps) {
time_actualsps = millis();
getSPS30Data();
}`;
var code = `m.mc_${dropdown_name}`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -1,29 +1,40 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
/** /**
* Telegram Bot by re:edu * Telegram Bot by re:edu
*/ */
Blockly.Arduino.sensebox_telegram = function (Block) { Blockly.Arduino.sensebox_telegram = function (Block) {
let token = Block.getFieldValue('telegram_token'); let token = Block.getFieldValue("telegram_token");
Blockly['Arduino'].libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly['Arduino'].libraries_['library_telegram'] = `#include <UniversalTelegramBot.h>` Blockly["Arduino"].libraries_[
Blockly['Arduino'].functionNames_['WiFiSSLClient'] = 'WiFiSSLClient client;'; "library_telegram"
Blockly['Arduino'].functionNames_['telegram_objects'] = `#define BOTtoken "${token}" // your Bot Token (Get from Botfather) ] = `#include <UniversalTelegramBot.h>`;
Blockly["Arduino"].functionNames_["WiFiSSLClient"] = "WiFiSSLClient client;";
Blockly["Arduino"].functionNames_[
"telegram_objects"
] = `#define BOTtoken "${token}" // your Bot Token (Get from Botfather)
UniversalTelegramBot bot(BOTtoken, client);` UniversalTelegramBot bot(BOTtoken, client);`;
let code = ''; let code = "";
return code; return code;
}; };
Blockly.Arduino.sensebox_telegram_do = function (block) { Blockly.Arduino.sensebox_telegram_do = function (block) {
var messageProcessing = Blockly.Arduino.statementToCode(block, 'telegram_do', Blockly.Arduino.ORDER_ATOMIC); var messageProcessing = Blockly.Arduino.statementToCode(
block,
"telegram_do",
Blockly.Arduino.ORDER_ATOMIC
);
Blockly.Arduino.definitions_['telegram_variables'] = `int Bot_mtbs = 1000; //mean time between scan messages Blockly.Arduino.definitions_[
long Bot_lasttime; //last time messages' scan has been done` "telegram_variables"
] = `int Bot_mtbs = 1000; //mean time between scan messages
long Bot_lasttime; //last time messages' scan has been done`;
Blockly.Arduino.loopCodeOnce_['sensebox_telegram_loop'] = `if (millis() > Bot_lasttime + Bot_mtbs) { Blockly.Arduino.loopCodeOnce_[
"sensebox_telegram_loop"
] = `if (millis() > Bot_lasttime + Bot_mtbs) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1); int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while(numNewMessages) { while(numNewMessages) {
for(int i=0; i<numNewMessages; i++) { for(int i=0; i<numNewMessages; i++) {
@ -36,13 +47,17 @@ Blockly.Arduino.sensebox_telegram_do = function (block) {
} }
Bot_lasttime = millis(); Bot_lasttime = millis();
}`; }`;
var code = ''; var code = "";
return code; return code;
}; };
Blockly.Arduino.sensebox_telegram_do_on_message = function (block) { Blockly.Arduino.sensebox_telegram_do_on_message = function (block) {
var message = this.getFieldValue('telegram_message'); var message = this.getFieldValue("telegram_message");
var stuffToDo = Blockly.Arduino.statementToCode(block, 'telegram_do_on_message', Blockly.Arduino.ORDER_ATOMIC); var stuffToDo = Blockly.Arduino.statementToCode(
block,
"telegram_do_on_message",
Blockly.Arduino.ORDER_ATOMIC
);
var code = ` var code = `
if (text == "${message}") { if (text == "${message}") {
${stuffToDo} ${stuffToDo}
@ -51,7 +66,12 @@ Blockly.Arduino.sensebox_telegram_do_on_message = function (block) {
}; };
Blockly.Arduino.sensebox_telegram_send = function (block) { Blockly.Arduino.sensebox_telegram_send = function (block) {
var textToSend = Blockly.Arduino.valueToCode(this, 'telegram_text_to_send', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; var textToSend =
Blockly.Arduino.valueToCode(
this,
"telegram_text_to_send",
Blockly.Arduino.ORDER_ATOMIC
) || '"Keine Eingabe"';
var code = `bot.sendMessage(chat_id, String(${textToSend}), "");\n`; var code = `bot.sendMessage(chat_id, String(${textToSend}), "");\n`;
return code; return code;
}; };

View File

@ -1,25 +1,122 @@
import Blockly from 'blockly'; import Blockly from "blockly";
//import store from "../../../store";
// preperations for the esp board
// var selectedBoard = store.getState().board.board;
// store.subscribe(() => {
// selectedBoard = store.getState().board.board;
// });
/* Wifi connection and openSenseMap Blocks*/ /* Wifi connection and openSenseMap Blocks*/
Blockly.Arduino.sensebox_wifi = function (block) { Blockly.Arduino.sensebox_wifi = function (block) {
var pw = this.getFieldValue('Password'); var pw = this.getFieldValue("Password");
var ssid = this.getFieldValue('SSID'); var ssid = this.getFieldValue("SSID");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_network'] = 'Bee* b = new Bee();'; Blockly.Arduino.libraries_["library_WiFi"] = "#include <WiFi101.h>";
if (pw === "") { Blockly.Arduino.variables_["ssid"] = `char ssid[] = "${ssid}";`;
Blockly.Arduino.setupCode_['sensebox_network'] = 'b->connectToWifi("' + ssid + '");\ndelay(1000);'; Blockly.Arduino.variables_["pass"] = `char pass[] = "${pw}";`;
} else Blockly.Arduino.variables_["wifi_Status"] = "int status = WL_IDLE_STATUS;";
Blockly.Arduino.setupCode_['sensebox_network'] = 'b->connectToWifi("' + ssid + '","' + pw + '");\ndelay(1000);'; if (pw === "") {
var code = ''; Blockly.Arduino.setupCode_["wifi_begin"] = `
return code; if (WiFi.status() == WL_NO_SHIELD) {
while (true);
}
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid);
delay(5000);
}
`;
} else
Blockly.Arduino.setupCode_["wifi_begin"] = `
if (WiFi.status() == WL_NO_SHIELD) {
while (true);
}
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, pass);
delay(5000);
}
`;
var code = "";
return code;
};
Blockly.Arduino.sensebox_wifi_status = function () {
var code = "WiFi.status()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.sensebox_wifi_rssi = function () {
var code = "WiFi.RSSI()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.sensebox_get_ip = function () {
Blockly.Arduino.definitions_["define_ipadress"] = "IPAddress ip;";
Blockly.Arduino.setupCode_["sensebox_get_ip"] = " ip = WiFi.localIP();";
var code = "ip";
return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_startap = function (block) { Blockly.Arduino.sensebox_startap = function (block) {
var ssid = this.getFieldValue('SSID'); var ssid = this.getFieldValue("SSID");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.definitions_['define_network'] = 'Bee* b = new Bee();'; Blockly.Arduino.libraries_["library_WiFi"] = "#include <WiFi101.h>";
Blockly.Arduino.setupCode_['sensebox_network'] = 'b->startAP("' + ssid + '");' Blockly.Arduino.setupCode_["wifi_startAP"] = `WiFi.beginAP(${ssid});`;
var code = ''; var code = "";
return code; return code;
}; };
Blockly.Arduino.sensebox_ethernet = function () {
var ip = this.getFieldValue("ip");
var gateway = this.getFieldValue("gateway");
var subnetmask = this.getFieldValue("subnetmask");
var dns = this.getFieldValue("dns");
var mac = this.getFieldValue("mac");
var dhcp = this.getFieldValue("dhcp");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["library_ethernet"] =
"#include <Ethernet.h> // http://librarymanager/All#Ethernet";
Blockly.Arduino.definitions_["ethernet_config"] = `
byte mac[] = { ${mac}};`;
if (dhcp === "Manual") {
Blockly.Arduino.definitions_["ethernet_manual_config"] = `
//Configure static IP setup (only needed if DHCP is disabled)
IPAddress myIp(${ip.replaceAll(".", ", ")});
IPAddress myDns(${dns.replaceAll(".", ",")});
IPAddress myGateway(${gateway.replaceAll(".", ",")});
IPAddress mySubnet(${subnetmask.replaceAll(".", ",")});
`;
Blockly.Arduino.setupCode_["ethernet_setup"] = `
Ethernet.init(23);
// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
// no point in carrying on, so do nothing forevermore:
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, myIp);
}
// give the Ethernet shield a second to initialize:
delay(1000);
`;
} else {
Blockly.Arduino.setupCode_["ethernet_setup"] = `
Ethernet.init(23);
// start the Ethernet connection:
Ethernet.begin(mac);
// give the Ethernet shield a second to initialize:
delay(1000);
`;
}
var code = "";
return code;
};
Blockly.Arduino.sensebox_ethernetIp = function () {
var code = "Ethernet.localIP()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -0,0 +1,35 @@
import * as Blockly from "blockly/core";
Blockly.Arduino["print_serial_monitor"] = function (block) {
var serialId = block.getFieldValue("SERIAL_ID");
var content =
Blockly.Arduino.valueToCode(
block,
"CONTENT",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var checkbox_name = block.getFieldValue("NEW_LINE") === "TRUE";
var code = "";
if (checkbox_name) {
code = serialId + ".println(" + content + ");\n";
} else {
code = serialId + ".print(" + content + ");\n";
}
return code;
};
/**
* Code generator for block for setting the serial com speed.
* Arduino code: setup{ Serial.begin(X); }
* @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code.
*/
Blockly.Arduino["init_serial_monitor"] = function (block) {
var serialId = block.getFieldValue("SERIAL_ID");
var serialSpeed = block.getFieldValue("SPEED");
Blockly.Arduino.setupCode_[
"init_serial"
] = `${serialId}.begin(${serialSpeed});`;
var code = "";
return code;
};

View File

@ -1,5 +1,4 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
/** /**
* Code generator for a literal String (X). * Code generator for a literal String (X).
@ -7,12 +6,11 @@ import * as Blockly from 'blockly/core';
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['text'] = function (block) { Blockly.Arduino["text"] = function (block) {
var code = Blockly.Arduino.quote_(block.getFieldValue('TEXT')); var code = Blockly.Arduino.quote_(block.getFieldValue("TEXT"));
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
* Code generator for a String concatenation (X...Y). This string can be made * Code generator for a String concatenation (X...Y). This string can be made
* up of any number of elements of any type. * up of any number of elements of any type.
@ -22,30 +20,37 @@ Blockly.Arduino['text'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['text_join'] = function (block) { Blockly.Arduino["text_join"] = function (block) {
var code; var code;
if (block.itemCount_ === 0) { if (block.itemCount_ === 0) {
return ['""', Blockly.Arduino.ORDER_ATOMIC]; return ['""', Blockly.Arduino.ORDER_ATOMIC];
} else if (block.itemCount_ === 1) { } else if (block.itemCount_ === 1) {
var argument0 = Blockly.Arduino.valueToCode(block, 'ADD0', var argument0 =
Blockly.Arduino.ORDER_UNARY_POSTFIX) || '""'; Blockly.Arduino.valueToCode(
code = 'String(' + argument0 + ')'; block,
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; "ADD0",
} else { Blockly.Arduino.ORDER_UNARY_POSTFIX
var argument; ) || '""';
code = []; code = "String(" + argument0 + ")";
for (var n = 0; n < block.itemCount_; n++) { return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
argument = Blockly.Arduino.valueToCode( } else {
block, 'ADD' + n, Blockly.Arduino.ORDER_NONE); var argument;
if (argument === '') { code = [];
code[n] = '""'; for (var n = 0; n < block.itemCount_; n++) {
} else { argument = Blockly.Arduino.valueToCode(
code[n] = 'String(' + argument + ')'; block,
} "ADD" + n,
} Blockly.Arduino.ORDER_NONE
code = code.join(' + '); );
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; if (argument === "") {
code[n] = '""';
} else {
code[n] = "String(" + argument + ")";
}
} }
code = code.join(" + ");
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
}
}; };
/** /**
@ -55,18 +60,23 @@ Blockly.Arduino['text_join'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['text_append'] = function (block) { Blockly.Arduino["text_append"] = function (block) {
// Append to a variable in place. // Append to a variable in place.
var varName = Blockly.Arduino.variableDB_.getName( var varName = Blockly.Arduino.nameDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); block.getFieldValue("VAR"),
var argument0 = Blockly.Arduino.valueToCode(block, 'TEXT', Blockly.Variables.NAME_TYPE
Blockly.Arduino.ORDER_UNARY_POSTFIX); );
if (argument0 === '') { var argument0 = Blockly.Arduino.valueToCode(
argument0 = '""'; block,
} else { "TEXT",
argument0 = 'String(' + argument0 + ')'; Blockly.Arduino.ORDER_UNARY_POSTFIX
} );
return varName + ' += ' + argument0 + ';\n'; if (argument0 === "") {
argument0 = '""';
} else {
argument0 = "String(" + argument0 + ")";
}
return varName + " += " + argument0 + ";\n";
}; };
/** /**
@ -76,10 +86,13 @@ Blockly.Arduino['text_append'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['text_length'] = function (block) { Blockly.Arduino["text_length"] = function (block) {
var argument0 = Blockly.Arduino.valueToCode(block, 'VALUE', var argument0 =
Blockly.Arduino.ORDER_UNARY_POSTFIX) || '""'; Blockly.Arduino.valueToCode(
var code = 'String(' + argument0 + ').length()'; block,
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX]; "VALUE",
Blockly.Arduino.ORDER_UNARY_POSTFIX
) || '""';
var code = "String(" + argument0 + ").length()";
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
}; };

View File

@ -1,4 +1,4 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/** /**
* @license Licensed under the Apache License, Version 2.0 (the "License"): * @license Licensed under the Apache License, Version 2.0 (the "License"):
@ -16,11 +16,15 @@ import Blockly from 'blockly';
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['time_delay'] = function (block) { Blockly.Arduino["time_delay"] = function (block) {
var delayTime = Blockly.Arduino.valueToCode( var delayTime =
block, 'DELAY_TIME_MILI', Blockly.Arduino.ORDER_ATOMIC) || '0'; Blockly.Arduino.valueToCode(
var code = 'delay(' + delayTime + ');\n'; block,
return code; "DELAY_TIME_MILI",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var code = "delay(" + delayTime + ");\n";
return code;
}; };
/** /**
@ -29,11 +33,15 @@ Blockly.Arduino['time_delay'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['time_delaymicros'] = function (block) { Blockly.Arduino["time_delaymicros"] = function (block) {
var delayTimeMs = Blockly.Arduino.valueToCode( var delayTimeMs =
block, 'DELAY_TIME_MICRO', Blockly.Arduino.ORDER_ATOMIC) || '0'; Blockly.Arduino.valueToCode(
var code = 'delayMicroseconds(' + delayTimeMs + ');\n'; block,
return code; "DELAY_TIME_MICRO",
Blockly.Arduino.ORDER_ATOMIC
) || "0";
var code = "delayMicroseconds(" + delayTimeMs + ");\n";
return code;
}; };
/** /**
@ -42,9 +50,9 @@ Blockly.Arduino['time_delaymicros'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['time_millis'] = function (block) { Blockly.Arduino["time_millis"] = function (block) {
var code = 'millis()'; var code = "millis()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
@ -53,9 +61,9 @@ Blockly.Arduino['time_millis'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {array} Completed code with order of operation. * @return {array} Completed code with order of operation.
*/ */
Blockly.Arduino['time_micros'] = function (block) { Blockly.Arduino["time_micros"] = function (block) {
var code = 'micros()'; var code = "micros()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/** /**
@ -64,17 +72,39 @@ Blockly.Arduino['time_micros'] = function (block) {
* @param {!Blockly.Block} block Block to generate the code from. * @param {!Blockly.Block} block Block to generate the code from.
* @return {string} Completed code. * @return {string} Completed code.
*/ */
Blockly.Arduino['infinite_loop'] = function (block) { Blockly.Arduino["infinite_loop"] = function (block) {
return 'while(true);\n'; return "while(true);\n";
}; };
// Blockly.Arduino.sensebox_interval_timer = function (block) {
// var interval = this.getFieldValue("interval");
// Blockly.Arduino.variables_["define_interval_variables"] =
// "const long interval = " +
// interval +
// ";\nlong time_start = 0;\nlong time_actual = 0;";
// var branch = Blockly.Arduino.statementToCode(block, "DO");
// var code = "time_start = millis();\n";
// code +=
// "if (time_start > time_actual + interval) {\n time_actual = millis();\n";
// code += branch;
// code += "}\n";
// return code;
// };
Blockly.Arduino.sensebox_interval_timer = function (block) { Blockly.Arduino.sensebox_interval_timer = function (block) {
var interval = this.getFieldValue('interval'); var intervalTime = this.getFieldValue("interval");
Blockly.Arduino.variables_['define_interval_variables'] = 'const long interval = ' + interval + ';\nlong time_start = 0;\nlong time_actual = 0;'; var intervalName = this.getFieldValue("name");
var branch = Blockly.Arduino.statementToCode(block, 'DO'); Blockly.Arduino.variables_[`define_interval_variables${intervalName}`] = `
var code = 'time_start = millis();\n'; const long interval${intervalName} = ${intervalTime};
code += 'if (time_start > time_actual + interval) {\n time_actual = millis();\n' long time_start${intervalName} = 0;
code += branch; long time_actual${intervalName} = 0;`;
code += '}\n' Blockly.Arduino.loopCodeOnce_[
return code; `interval_loop${intervalName}`
}; ] = `time_start${intervalName} = millis();\n`;
var branch = Blockly.Arduino.statementToCode(block, "DO");
var code = `
if (time_start${intervalName} > time_actual${intervalName} + interval${intervalName}) {\n time_actual${intervalName} = millis();\n`;
code += branch;
code += "}\n";
return code;
};

View File

@ -2,10 +2,17 @@ import Blockly from "blockly";
const setVariableFunction = function (defaultValue) { const setVariableFunction = function (defaultValue) {
return function (block) { return function (block) {
const variableName = Blockly["Arduino"].variableDB_.getName( var id = block.getFieldValue("VAR");
block.getFieldValue("VAR"),
Blockly.Variables.NAME_TYPE const variableName = Blockly.Variables.getVariable(
); Blockly.getMainWorkspace(),
id
).name;
// const variableName = Blockly["Arduino"].nameDB_.getName(
// id,
// Blockly.Variables.NAME_TYPE
// );
const variableValue = Blockly["Arduino"].valueToCode( const variableValue = Blockly["Arduino"].valueToCode(
block, block,
"VALUE", "VALUE",
@ -17,42 +24,32 @@ const setVariableFunction = function (defaultValue) {
.getAllVariables(); .getAllVariables();
const myVar = allVars.filter((v) => v.name === variableName)[0]; const myVar = allVars.filter((v) => v.name === variableName)[0];
var code = ""; var code = "";
if (myVar !== undefined) {
switch (myVar.type) { Blockly.Arduino.variables_[variableName + myVar.type] =
default: myVar.type + " " + myVar.name + ";\n";
Blockly.Arduino.variables_[variableName + myVar.type] = code = variableName + " = " + (variableValue || defaultValue) + ";\n";
myVar.type + " " + myVar.name + ";\n";
code = variableName + " = " + (variableValue || defaultValue) + ";\n";
break;
case "Array":
var arrayType;
var number;
if (this.getChildren().length > 0) {
if (this.getChildren()[0].type === "lists_create_empty") {
arrayType = this.getChildren()[0].getFieldValue("type");
number = Blockly.Arduino.valueToCode(
this.getChildren()[0],
"NUMBER",
Blockly["Arduino"].ORDER_ATOMIC
);
Blockly.Arduino.variables_[
myVar + myVar.type
] = `${arrayType} ${myVar.name} [${number}];\n`;
}
}
break;
} }
return code; return code;
}; };
}; };
const getVariableFunction = function (block) { const getVariableFunction = function (block) {
const variableName = Blockly["Arduino"].variableDB_.getName( var id = block.getFieldValue("VAR");
block.getFieldValue("VAR"),
Blockly.Variables.NAME_TYPE const variableName = Blockly.Variables.getVariable(
); Blockly.getMainWorkspace(),
var code = variableName; id
).name;
const allVars = Blockly.getMainWorkspace()
.getVariableMap()
.getAllVariables();
const myVar = allVars.filter((v) => v.name === variableName)[0];
// const variableName = Blockly["Arduino"].nameDB_.getName(
// block.getFieldValue("VAR"),
// Blockly.Variables.NAME_TYPE
// );
var code = myVar.name;
return [code, Blockly["Arduino"].ORDER_ATOMIC]; return [code, Blockly["Arduino"].ORDER_ATOMIC];
}; };

View File

@ -0,0 +1,16 @@
import * as Blockly from "blockly/core";
Blockly.Arduino.watchdog_enable = function () {
var time = this.getFieldValue("TIME");
Blockly.Arduino.libraries_["Adafruit_sleepydog"] =
"#include <Adafruit_SleepyDog.h> // http://librarymanager/All#Adafruit_SleepyDog_Library";
Blockly.Arduino.setupCode_["watchdog_enable"] = `Watchdog.enable(${time});`;
var code = "";
return code;
};
Blockly.Arduino.watchdog_reset = function () {
var code = "Watchdog.reset();";
return code;
};

View File

@ -1,114 +1,133 @@
import Blockly from 'blockly'; import Blockly from "blockly";
/** /**
* Webserver Blocks by Lucas Steinmann * Webserver Blocks by Lucas Steinmann
* *
*/ */
Blockly.Arduino.sensebox_initialize_http_server = function (block) { Blockly.Arduino.sensebox_initialize_http_server = function (block) {
var box_id = this.getFieldValue('Port'); var box_id = this.getFieldValue("Port");
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.codeFunctions_['define_wifi_server'] = 'WiFiServer server(' + box_id + ');'; Blockly.Arduino.libraries_["library_http"] = "#include <WebUtil.h>";
Blockly.Arduino.setupCode_['sensebox_wifi_server_beging'] = 'server.begin();';
return ''; Blockly.Arduino.codeFunctions_["define_wifi_server"] =
"WiFiServer server(" + box_id + ");";
Blockly.Arduino.setupCode_["sensebox_wifi_server_beging"] = "server.begin();";
return "";
}; };
Blockly.Arduino.sensebox_http_on_client_connect = function (block) { Blockly.Arduino.sensebox_http_on_client_connect = function (block) {
var onConnect = Blockly.Arduino.statementToCode(block, 'ON_CONNECT'); var onConnect = Blockly.Arduino.statementToCode(block, "ON_CONNECT");
var code = ''; var code = "";
code += 'WiFiClient client = server.available();\n'; code += "WiFiClient client = server.available();\n";
code += 'if (client && client.available()) {\n'; code += "if (client && client.available()) {\n";
code += ' String request_string = listenClient(client);\n'; code += " String request_string = listenClient(client);\n";
code += ' Request request;\n'; code += " Request request;\n";
code += ' if (parseRequestSafe(request_string, request)) {\n'; code += " if (parseRequestSafe(request_string, request)) {\n";
code += onConnect; code += onConnect;
code += ' }\n'; code += " }\n";
code += ' delay(1);\n'; code += " delay(1);\n";
code += ' client.stop();\n'; code += " client.stop();\n";
code += ' delay(1);\n'; code += " delay(1);\n";
code += '}\n'; code += "}\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_http_method = function (block) { Blockly.Arduino.sensebox_http_method = function (block) {
var code = "request.method"; var code = "request.method";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_http_uri = function (block) { Blockly.Arduino.sensebox_http_uri = function (block) {
var code = "request.uri"; var code = "request.uri";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_http_protocol_version = function (block) { Blockly.Arduino.sensebox_http_protocol_version = function (block) {
var code = "request.protocol_version"; var code = "request.protocol_version";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_http_user_agent = function (block) { Blockly.Arduino.sensebox_http_user_agent = function (block) {
var code = "request.user_agent"; var code = "request.user_agent";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_generate_html_doc = function (block) { Blockly.Arduino.sensebox_generate_html_doc = function (block) {
var header = Blockly.Arduino.valueToCode(block, 'HEADER', Blockly.Arduino.ORDER_NONE) || '""'; var header =
var body = Blockly.Arduino.valueToCode(block, 'BODY', Blockly.Arduino.ORDER_NONE) || '""'; Blockly.Arduino.valueToCode(block, "HEADER", Blockly.Arduino.ORDER_NONE) ||
var code = 'buildHTML(' + header + ', ' + body + ')'; '""';
return [code, Blockly.Arduino.ORDER_ATOMIC]; var body =
Blockly.Arduino.valueToCode(block, "BODY", Blockly.Arduino.ORDER_NONE) ||
'""';
var code = "buildHTML(" + header + ", " + body + ")";
return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_generate_http_succesful_response = function (block) { Blockly.Arduino.sensebox_generate_http_succesful_response = function (block) {
var content = Blockly.Arduino.valueToCode(block, 'CONTENT', Blockly.Arduino.ORDER_NONE) || '""'; var content =
var code = 'client.println(buildSuccessfulResponse(request, ' + content + '));\n'; Blockly.Arduino.valueToCode(block, "CONTENT", Blockly.Arduino.ORDER_NONE) ||
return code; '""';
var code =
"client.println(buildSuccessfulResponse(request, " + content + "));\n";
return code;
}; };
Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) { Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) {
var code = 'client.println(buildNotFoundResponse(request));\n'; var code = "client.println(buildNotFoundResponse(request));\n";
return code; return code;
}; };
Blockly.Arduino.sensebox_ip_address = function (block) { Blockly.Arduino.sensebox_ip_address = function (block) {
var code = "b->getIpAddress()"; var code = "b->getIpAddress()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_general_html_tag = function (block) { Blockly.Arduino.sensebox_general_html_tag = function (block) {
var tag = this.getFieldValue('TAG'); var tag = this.getFieldValue("TAG");
var code = 'buildTag("' + tag + '",'; var code = 'buildTag("' + tag + '",';
var n = 0; var n = 0;
var branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); var branch = Blockly.Arduino.valueToCode(
if (branch.length > 0) { block,
code += '\n ' + branch; "DO" + n,
} else { Blockly.Arduino.ORDER_NONE
code += '""'; );
} if (branch.length > 0) {
for (n = 1; n <= block.additionalChildCount_; n++) { code += "\n " + branch;
branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); } else {
code += ' +' + branch; code += '""';
} }
return [code + ')', Blockly.Arduino.ORDER_ATOMIC]; for (n = 1; n <= block.additionalChildCount_; n++) {
branch = Blockly.Arduino.valueToCode(
block,
"DO" + n,
Blockly.Arduino.ORDER_NONE
);
code += " +" + branch;
}
return [code + ")", Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_web_readHTML = function (block) { Blockly.Arduino.sensebox_web_readHTML = function (block) {
var filename = this.getFieldValue('FILENAME'); var filename = this.getFieldValue("FILENAME");
Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>'; Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
Blockly.Arduino.libraries_['library_sd'] = '#include <SD.h>'; Blockly.Arduino.libraries_["library_sd"] = "#include <SD.h>";
Blockly.Arduino.codeFunctions_['define_sd' + filename] = 'File webFile;'; Blockly.Arduino.codeFunctions_["define_sd" + filename] = "File webFile;";
Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);";
var func = [ var func = [
'String generateHTML(){', "String generateHTML(){",
' webFile = SD.open("' + filename + '", FILE_READ);', ' webFile = SD.open("' + filename + '", FILE_READ);',
' String finalString ="";', ' String finalString ="";',
' while (webFile.available())', " while (webFile.available())",
' {', " {",
' finalString+=(char)webFile.read();', " finalString+=(char)webFile.read();",
' }', " }",
' return finalString;', " return finalString;",
'}']; "}",
var functionName = Blockly.Arduino.addFunction( ];
'generateHTML', func.join('\n')); var functionName = Blockly.Arduino.addFunction(
var code = functionName + '()'; "generateHTML",
return [code, Blockly.Arduino.ORDER_ATOMIC]; func.join("\n")
}; );
var code = functionName + "()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -3,42 +3,266 @@
* *
*/ */
const sensebox_mcu = { const sensebox_mcu = {
description: 'senseBox Microcontroller Unit based on Microchip SAMD21G18A', description: "senseBox Microcontroller Unit based on Microchip SAMD21G18A",
compilerFlag: 'arduino:samd', compilerFlag: "arduino:samd",
digitalPins: [['D1', '1'], ['D2', '2'], ['D3', '3'], ['D4', '4'], ['D5', '5'], ['D6', '6']], digitalPins: [
digitalPinsLED: [['BUILTIN_1', '7'], ['BUILTIN_2', '8'], ['D1', '1'], ['D2', '2'], ['D3', '3'], ['D4', '4'], ['D5', '5'], ['D6', '6']], ["A1", "1"],
digitalPinsButton: [['on Board', '0'], ['D1', '1'], ['D2', '2'], ['D3', '3'], ['D4', '4'], ['D5', '5'], ['D6', '6']], ["A2", "2"],
pwmPins: [['D1', '1'], ['D2', '2'], ['D3', '3'], ['D4', '4'], ['D5', '5'], ['D6', '6']], ["B3", "3"],
serial: [['serial', 'SerialUSB'], ['serial_1', 'Serial1'], ['serial_2', 'Serial2']], ["B4", "4"],
serialPins: { ["C5", "5"],
SerialUSB: [['RX', ''], ['TX', '']], ["C6", "6"],
Serial1: [['RX', '11'], ['TX', '10']], ],
Serial2: [['RX', '13'], ['TX', '12']] digitalPorts: [
}, ["A", "A"],
serialSpeed: [['300', '300'], ['600', '600'], ['1200', '1200'], ["B", "B"],
['2400', '2400'], ['4800', '4800'], ['9600', '9600'], ["C", "C"],
['14400', '14400'], ['19200', '19200'], ['28800', '28800'], ],
['31250', '31250'], ['38400', '38400'], ['57600', '57600'], digitalPinsLED: [
['115200', '115200']], ["BUILTIN_1", "7"],
spi: [['SPI', 'SPI']], ["BUILTIN_2", "8"],
spiPins: { SPI: [['MOSI', '19'], ['MISO', '21'], ['SCK', '20']] }, ["A1", "1"],
spiClockDivide: [['2 (8MHz)', 'SPI_CLOCK_DIV2'], ["A2", "2"],
['4 (4MHz)', 'SPI_CLOCK_DIV4'], ["B3", "3"],
['8 (2MHz)', 'SPI_CLOCK_DIV8'], ["B4", "4"],
['16 (1MHz)', 'SPI_CLOCK_DIV16'], ["C5", "5"],
['32 (500KHz)', 'SPI_CLOCK_DIV32'], ["C6", "6"],
['64 (250KHz)', 'SPI_CLOCK_DIV64'], ],
['128 (125KHz)', 'SPI_CLOCK_DIV128']], digitalPinsRGB: [
i2c: [['I2C', 'Wire']], ["A", "1"],
i2cPins: { Wire: [['SDA', '17'], ['SCL', '16']] }, ["B", "3"],
i2cSpeed: [['100kHz', '100000L'], ['400kHz', '400000L']], ["C", "5"],
builtinLed: [['BUILTIN_1', '7'], ['BUILTIN_2', '8']], ],
interrupt: [['interrupt1', '1'], ['interrupt2', '2'], ['interrupt3', '3'], ['interrupt4', '4'], ['interrupt5', '5'], ['interrupt6', '6']], digitalPinsButton: [
analogPins: [['A1', 'A1'], ['A2', 'A2'], ['A3', 'A3'], ['A4', 'A4'], ['A5', 'A5'], ['A6', 'A6']], ["on Board", "0"],
serial_baud_rate: 9600, ["A1", "1"],
parseKey: '_*_' ["A2", "2"],
["B3", "3"],
["B4", "4"],
["C5", "5"],
["C6", "6"],
],
pwmPins: [
["A1", "1"],
["A2", "2"],
["B3", "3"],
["B4", "4"],
["C5", "5"],
["C6", "6"],
],
serial: [
["SerialUSB", "SerialUSB"],
["Serial1", "Serial1"],
["Serial2", "Serial2"],
],
serialSensors: [
["Serial1", "Serial1"],
["Serial2", "Serial2"],
],
serialPins: {
SerialUSB: [
["RX", ""],
["TX", ""],
],
Serial1: [
["RX", "11"],
["TX", "10"],
],
Serial2: [
["RX", "13"],
["TX", "12"],
],
},
serialSpeed: [
["300", "300"],
["600", "600"],
["1200", "1200"],
["2400", "2400"],
["4800", "4800"],
["9600", "9600"],
["14400", "14400"],
["19200", "19200"],
["28800", "28800"],
["31250", "31250"],
["38400", "38400"],
["57600", "57600"],
["115200", "115200"],
],
spi: [["SPI", "SPI"]],
spiPins: {
SPI: [
["MOSI", "19"],
["MISO", "21"],
["SCK", "20"],
],
},
spiClockDivide: [
["2 (8MHz)", "SPI_CLOCK_DIV2"],
["4 (4MHz)", "SPI_CLOCK_DIV4"],
["8 (2MHz)", "SPI_CLOCK_DIV8"],
["16 (1MHz)", "SPI_CLOCK_DIV16"],
["32 (500KHz)", "SPI_CLOCK_DIV32"],
["64 (250KHz)", "SPI_CLOCK_DIV64"],
["128 (125KHz)", "SPI_CLOCK_DIV128"],
],
i2c: [["I2C", "Wire"]],
i2cPins: {
Wire: [
["SDA", "17"],
["SCL", "16"],
],
},
i2cSpeed: [
["100kHz", "100000L"],
["400kHz", "400000L"],
],
builtinLed: [
["BUILTIN_1", "7"],
["BUILTIN_2", "8"],
],
interrupt: [
["interrupt1", "1"],
["interrupt2", "2"],
["interrupt3", "3"],
["interrupt4", "4"],
["interrupt5", "5"],
["interrupt6", "6"],
],
analogPins: [
["A1", "A1"],
["A2", "A2"],
["B3", "A3"],
["B4", "A4"],
["C5", "A5"],
["C6", "A6"],
],
serial_baud_rate: 9600,
parseKey: "_*_",
}; };
export const selectedBoard = () => { //senseBox MCU mini
return sensebox_mcu; const sensebox_mini = {
description: "senseBox Mini",
compilerFlag: "arduino:samd",
digitalPins: [
["IO1", "1"],
["IO2", "2"],
],
digitalPorts: [
["IO1-2", "A"],
],
digitalPinsLED: [
["BUILTIN_1", "7"],
["BUILTIN_2", "8"],
["IO1", "1"],
["IO2", "2"],
],
digitalPinsRGB: [
["on Board", "6"],
["IO1-2", "1"],
],
digitalPinsButton: [
["on Board", "0"],
["IO1", "1"],
["IO2", "2"],
],
pwmPins: [
["IO1", "1"],
["IO2", "2"],
],
serial: [
["SerialUSB", "SerialUSB"],
["Serial1", "Serial1"],
],
serialSensors: [
["Serial1", "Serial1"],
],
serialPins: {
SerialUSB: [
["RX", ""],
["TX", ""],
],
Serial1: [
["RX", "11"],
["TX", "10"],
],
Serial2: [
["RX", "13"],
["TX", "12"],
],
},
serialSpeed: [
["300", "300"],
["600", "600"],
["1200", "1200"],
["2400", "2400"],
["4800", "4800"],
["9600", "9600"],
["14400", "14400"],
["19200", "19200"],
["28800", "28800"],
["31250", "31250"],
["38400", "38400"],
["57600", "57600"],
["115200", "115200"],
],
spi: [["SPI", "SPI"]],
spiPins: {
SPI: [
["MOSI", "19"],
["MISO", "21"],
["SCK", "20"],
],
},
spiClockDivide: [
["2 (8MHz)", "SPI_CLOCK_DIV2"],
["4 (4MHz)", "SPI_CLOCK_DIV4"],
["8 (2MHz)", "SPI_CLOCK_DIV8"],
["16 (1MHz)", "SPI_CLOCK_DIV16"],
["32 (500KHz)", "SPI_CLOCK_DIV32"],
["64 (250KHz)", "SPI_CLOCK_DIV64"],
["128 (125KHz)", "SPI_CLOCK_DIV128"],
],
i2c: [["I2C", "Wire"]],
i2cPins: {
Wire: [
["SDA", "17"],
["SCL", "16"],
],
},
i2cSpeed: [
["100kHz", "100000L"],
["400kHz", "400000L"],
],
builtinLed: [
["BUILTIN_1", "7"],
["BUILTIN_2", "8"],
],
interrupt: [
["interrupt1", "1"],
["interrupt2", "2"],
],
analogPins: [
["A1", "A1"],
["A2", "A2"],
],
serial_baud_rate: 9600,
parseKey: "_*_",
};
var board = sensebox_mcu
export const setBoard = (selectedBoard) => {
if (selectedBoard === "mini"){
board = sensebox_mini
}
else {
board = sensebox_mcu
}
}
export const selectedBoard = () => {
return board;
}; };

View File

@ -11,8 +11,11 @@ const colours = {
audio: 250, audio: 250,
arrays: 33, arrays: 33,
mqtt: 90, mqtt: 90,
serial: 230,
webserver: 40, webserver: 40,
phyphox: 25, phyphox: 25,
motors: 190,
cleverlab: 185 ,
}; };
export const getColour = () => { export const getColour = () => {

View File

@ -0,0 +1,23 @@
/**
* To limit number of specific blocks in the workspace add block name and number of maxInstances here.
*
*/
const maxInstances = {
sensebox_wifi: 1,
sensebox_startap: 1,
sensebox_display_beginDisplay: 1,
sensebox_telegram: 1,
sensebox_telegram_do: 1,
sensebox_osem_connection: 1,
sensebox_lora_initialize_otaa: 1,
sensebox_lora_initialize_abp: 1,
sensebox_phyphox_init: 1,
sensebox_phyphox_experiment: 1,
sensebox_phyphox_experiment_send: 1,
sensebox_ethernet: 1,
};
export const getMaxInstances = () => {
return maxInstances;
};

View File

@ -1,6 +1,6 @@
/** /**
* @license * @license
* *
* Copyright 2019 Google LLC * Copyright 2019 Google LLC
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -21,39 +21,51 @@
* @author samelh@google.com (Sam El-Husseini) * @author samelh@google.com (Sam El-Husseini)
*/ */
import React from 'react'; import React from "react";
import BlocklyComponent from './BlocklyComponent'; import BlocklyComponent from "./BlocklyComponent";
export default BlocklyComponent; export default BlocklyComponent;
const Block = (p) => { const Block = (p) => {
const { children, ...props } = p; const { children, ...props } = p;
props.is = "blockly"; props.is = "blockly";
return React.createElement("block", props, children); return React.createElement("block", props, children);
}; };
const Category = (p) => { const Category = (p) => {
const { children, ...props } = p; const { children, ...props } = p;
props.is = "blockly"; props.is = "blockly";
return React.createElement("category", props, children); return React.createElement("category", props, children);
}; };
const Value = (p) => { const Value = (p) => {
const { children, ...props } = p; const { children, ...props } = p;
props.is = "blockly"; props.is = "blockly";
return React.createElement("value", props, children); return React.createElement("value", props, children);
}; };
const Field = (p) => { const Field = (p) => {
const { children, ...props } = p; const { children, ...props } = p;
props.is = "blockly"; props.is = "blockly";
return React.createElement("field", props, children); return React.createElement("field", props, children);
}; };
const Shadow = (p) => { const Shadow = (p) => {
const { children, ...props } = p; const { children, ...props } = p;
props.is = "blockly"; props.is = "blockly";
return React.createElement("shadow", props, children); return React.createElement("shadow", props, children);
}; };
export { Block, Category, Value, Field, Shadow } const Sep = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("sep", props, children);
};
const Label = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("label", props, children);
};
export { Block, Category, Value, Field, Shadow, Sep, Label };

View File

@ -7,10 +7,12 @@ import { LOOPS } from "./de/loops";
import { MATH } from "./de/math"; import { MATH } from "./de/math";
import { MQTT } from "./de/mqtt"; import { MQTT } from "./de/mqtt";
import { DISPLAY } from "./de/sensebox-display"; import { DISPLAY } from "./de/sensebox-display";
import { MOTORS } from "./de/sensebox-motors";
import { LED } from "./de/sensebox-led"; import { LED } from "./de/sensebox-led";
import { LORA } from "./de/sensebox-lora"; import { LORA } from "./de/sensebox-lora";
import { OSEM } from "./de/sensebox-osem"; import { OSEM } from "./de/sensebox-osem";
import { RTC } from "./de/sensebox-rtc"; import { RTC } from "./de/sensebox-rtc";
import { NTP } from "./de/sensebox-ntp";
import { SD } from "./de/sensebox-sd"; import { SD } from "./de/sensebox-sd";
import { SENSORS } from "./de/sensebox-sensors"; import { SENSORS } from "./de/sensebox-sensors";
import { SENSEBOX } from "./de/sensebox"; import { SENSEBOX } from "./de/sensebox";
@ -34,10 +36,12 @@ export const De = {
...MATH, ...MATH,
...MQTT, ...MQTT,
...DISPLAY, ...DISPLAY,
...MOTORS,
...LED, ...LED,
...LORA, ...LORA,
...OSEM, ...OSEM,
...RTC, ...RTC,
...NTP,
...SD, ...SD,
...SENSORS, ...SENSORS,
...SENSEBOX, ...SENSEBOX,

View File

@ -1,10 +1,10 @@
export const FAQ = { export const FAQ = {
/** /**
* FAQ * FAQ
*/ */
faq_q1_question: `Wie kann ich mein Programm auf die senseBox kopieren?`, faq_q1_question: `Wie kann ich mein Programm auf die senseBox kopieren?`,
faq_q1_answer: `Um Programme auf die senseBox zu kopieren wird diese mit dem Micro USB Kabel an den Computer angeschlossen. Mache anschließend auf der senseBox MCU einen Doppelklick auf den roten Reset Button. Die senseBox wird nun als Wechseldatenträger an deinem Computer erkannt und die zuvor erstellen Programm können per Drag & Drop kopiert werden. Nach jeder Änderung des Programmcodes muss das Programm neu kompiliert und übertragen werden faq_q1_answer: `Um Programme auf die senseBox zu kopieren wird diese mit dem Micro USB Kabel an den Computer angeschlossen. Mache anschließend auf der senseBox MCU einen Doppelklick auf den roten Reset Button. Die senseBox wird nun als Wechseldatenträger an deinem Computer erkannt und die zuvor erstellen Programm können per Drag & Drop kopiert werden. Nach jeder Änderung des Programmcodes muss das Programm neu kompiliert und übertragen werden
#### Lernmodus der MCU aktivieren #### Lernmodus der MCU aktivieren
<iframe width="560" height="315" src="https://www.youtube.com/embed/jzlOJ7Zuqqw" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <iframe width="560" height="315" src="https://www.youtube.com/embed/jzlOJ7Zuqqw" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -14,14 +14,16 @@ Das Kopieren der Programme unter MacOS funktioniert nicht über den Finder, es g
- [muCommander](https://www.mucommander.com/) - [muCommander](https://www.mucommander.com/)
`, `,
faq_q2_question: `Mit welcher senseBox ist die Programmierumgebung kompatibel?`, faq_q2_question: `Mit welcher senseBox ist die Programmierumgebung kompatibel?`,
faq_q2_answer: ` faq_q2_answer: `
Grundsätzlich kann die Programmierumgebung mit jeder senseBox mit senseBox MCU verwendet werden. Grundsätzlich kann die Programmierumgebung mit jeder senseBox mit senseBox MCU verwendet werden.
`, `,
faq_q3_question: `Ich habe einen Fehler gefunden oder etwas funktioniert nicht. Wo kann ich diesen melden?`,
faq_q3_question: `Ich habe einen Fehler gefunden oder etwas funktioniert nicht. Wo kann ich diesen melden?`, faq_q3_answer: `
faq_q3_answer: `
Am besten legst du dazu ein Issue auf [Github](https://github.com/sensebox/React-Ardublockly/issues) an. Alternativ kannst du uns auch eine Email an info(at)sensebox.de senden Am besten legst du dazu ein Issue auf [Github](https://github.com/sensebox/React-Ardublockly/issues) an. Alternativ kannst du uns auch eine Email an info(at)sensebox.de senden
`, `,
}
faq_tablet_question: `Kann ich die senseBox auch über ein Tablet programmieren?`,
faq_tablet_answer: `Ja! Installiere dazu die senseBox Connect App aus dem App Store und rufe die Learn- und Programmierumgebung in deinem Browser am Tablet auf. Genaue Informationen zur Verwendung der App findest du unter [https://sensebox.de/app](https://sensebox.de/app)`,
};

View File

@ -1,108 +1,118 @@
export const IO = { export const IO = {
ARD_ANALOGREAD: "lese analogen Pin#",
ARD_ANALOGREAD: "lese analogen Pin#", ARD_ANALOGREAD_TIP: "Gibt einen Wert zwischen 0 und 1023 zurück",
ARD_ANALOGREAD_TIP: "Gibt einen Wert zwischen 0 und 1024 zurüch", ARD_ANALOGWRITE: "setzte analogen Pin#",
ARD_ANALOGWRITE: "setzte analogen Pin#", ARD_ANALOGWRITE_TIP:
ARD_ANALOGWRITE_TIP: "Schreibe analogen Wert zwischen 0 und 255 an einen spezifischen PWM Port", "Schreibe analogen Wert zwischen 0 und 255 an einen spezifischen PWM Port",
ARD_BUILTIN_LED: "eingebaute LED", ARD_BUILTIN_LED: "eingebaute LED",
ARD_BUILTIN_LED_TIP: "Schaltet die interne LED An oder Aus", ARD_BUILTIN_LED_TIP: "Schaltet die interne LED An oder Aus",
ARD_COMPONENT_WARN1: "A %1 configuration block with the same %2 name must be added to use this block!", ARD_COMPONENT_WARN1:
ARD_DEFINE: "Definiere", "A %1 configuration block with the same %2 name must be added to use this block!",
ARD_DIGITALREAD: "lesen digitalen Pin#", ARD_DEFINE: "Definiere",
ARD_DIGITALREAD_TIP: "Lese Wert an digitalen Pin: HIGH(1) oder LOW(0)", ARD_DIGITALREAD: "lesen digitalen Pin#",
ARD_DIGITALWRITE: "setzte digitalen Pin#", ARD_DIGITALREAD_TIP: "Lese Wert an digitalen Pin: HIGH(1) oder LOW(0)",
ARD_DIGITALWRITE_TIP: "Schreibe digitalen Wert HIGH (1) oder LOW(0) an spezifischen Port", ARD_DIGITALWRITE: "setzte digitalen Pin#",
ARD_FUN_RUN_LOOP: "Endlosschleife()", ARD_DIGITALWRITE_TIP:
ARD_FUN_RUN_SETUP: "Setup()", "Schreibe digitalen Wert HIGH (1) oder LOW(0) an spezifischen Port",
ARD_FUN_RUN_TIP: "Definiert die setup() und loop() Funktionen. Die setup()-Funktion wird beim starten **einmal** ausgeführt. Anschließend wir die loop()-Funktion in einer **Endlosschleife** ausgeführt. Füge in die Setup()-Funktion Blöcke ein, um z.B. das Display zu initalisieren, eine Verbindung zum WiFi-Netzwerk herzustellen oder um die LoRa Verbindung zu initialsieren.", ARD_FUN_RUN_LOOP: "Endlosschleife()",
ARD_HIGH: "HIGH", ARD_FUN_RUN_SETUP: "Setup()",
ARD_HIGHLOW_TIP: "Setzt einen Status auf HIGH oder LOWSet a pin state logic High or Low.", ARD_FUN_RUN_TIP:
ARD_LOW: "LOW", "Definiert die setup() und loop() Funktionen. Die setup()-Funktion wird beim starten **einmal** ausgeführt. Anschließend wir die loop()-Funktion in einer **Endlosschleife** ausgeführt. Füge in die Setup()-Funktion Blöcke ein, um z.B. das Display zu initalisieren, eine Verbindung zum WiFi-Netzwerk herzustellen oder um die LoRa Verbindung zu initialsieren.",
ARD_MAP: "Verteile Wert", ARD_HIGH: "HIGH",
ARD_MAP_FROMMIN: "von Minimum", ARD_HIGHLOW_TIP:
ARD_MAP_FROMMAX: "bis maximum", "Setzt einen Status auf HIGH oder LOWSet a pin state logic High or Low.",
ARD_MAP_TOMIN: "auf Minimum", ARD_LOW: "LOW",
ARD_MAP_TOMAX: "bis Maximum", ARD_MAP: "Verteile Wert",
ARD_MAP_TIP: "Verteilt Werte zwischen [0-1024] zu andere.", ARD_MAP_FROMMIN: "von Minimum",
ARD_MAP_VAL: "Wert zu [0-", ARD_MAP_FROMMAX: "bis maximum",
ARD_NOTONE: "Schalte Ton aus an Pin", ARD_MAP_TOMIN: "auf Minimum",
ARD_NOTONE_PIN: "keinen Ton an Pin", ARD_MAP_TOMAX: "bis Maximum",
ARD_NOTONE_PIN_TIP: "Stoppe die Tonerzeugung an Pin", ARD_MAP_TIP: "Verteilt Werte zwischen [0-1024] zu andere.",
ARD_NOTONE_TIP: "Schaltet den Ton am ausgewählten Pin aus", ARD_MAP_VAL: "Wert zu [0-",
ARD_PIN_WARN1: "Pin %1 wird benötigt für %2 als Pin %3. Bereitsgenutzt als %4.", ARD_NOTONE: "Schalte Ton aus an Pin",
ARD_PULSETIMEOUT_TIP: "Misst die Laufzeit eines Impulses am ausgewählten Pin, wenn die Zeit ist in Microsekunden.", ARD_NOTONE_PIN: "keinen Ton an Pin",
ARD_PULSE_READ: "Misst %1 Impuls an Pin #%2", ARD_NOTONE_PIN_TIP: "Stoppe die Tonerzeugung an Pin",
ARD_PULSE_READ_TIMEOUT: "Misst %1 Impuls an Pin #%2 (Unterbrechung nach %3 μs)", ARD_NOTONE_TIP: "Schaltet den Ton am ausgewählten Pin aus",
ARD_PULSE_TIP: "Misst die Zeit eines Impulses an dem ausgewählten Pin.", ARD_PIN_WARN1:
ARD_SERIAL_BPS: "bps", "Pin %1 wird benötigt für %2 als Pin %3. Bereitsgenutzt als %4.",
ARD_SERIAL_PRINT: "schreibe", ARD_PULSETIMEOUT_TIP:
ARD_SERIAL_PRINT_NEWLINE: "neue Zeile hinzufügen", "Misst die Laufzeit eines Impulses am ausgewählten Pin, wenn die Zeit ist in Microsekunden.",
ARD_SERIAL_PRINT_TIP: "Prints data to the console/serial port as human-readable ASCII text.", // untranslated ARD_PULSE_READ: "Misst %1 Impuls an Pin #%2",
ARD_SERIAL_PRINT_WARN: "A setup block for %1 must be added to the workspace to use this block!", // untranslated ARD_PULSE_READ_TIMEOUT:
ARD_SERIAL_SETUP: "Setup", "Misst %1 Impuls an Pin #%2 (Unterbrechung nach %3 μs)",
ARD_SERIAL_SETUP_TIP: "Selects the speed for a specific Serial peripheral", // untranslated ARD_PULSE_TIP: "Misst die Zeit eines Impulses an dem ausgewählten Pin.",
ARD_SERIAL_SPEED: ": Übertragungsgeschwindigkeit zu", ARD_SERIAL_BPS: "bps",
ARD_SERVO_READ: "liest SERVO an PIN#", ARD_SERIAL_PRINT: "schreibe",
ARD_SERVO_READ_TIP: "Liest den Winkel des Servomotors aus", ARD_SERIAL_PRINT_NEWLINE: "neue Zeile hinzufügen",
ARD_SERVO_WRITE: "setzt SERVO an Pin", ARD_SERIAL_PRINT_TIP:
ARD_SERVO_WRITE_DEG_180: "Winkel (0~180)", "Prints data to the console/serial port as human-readable ASCII text.", // untranslated
ARD_SERVO_WRITE_TIP: "Set a Servo to an specified angle", // untranslated ARD_SERIAL_PRINT_WARN:
ARD_SERVO_WRITE_TO: "", // untranslated "A setup block for %1 must be added to the workspace to use this block!", // untranslated
ARD_SETTONE: "Spiele Ton an Pin", // untranslated ARD_SERIAL_SETUP: "Setup",
ARD_SPI_SETUP: "Setup", ARD_SERIAL_SETUP_TIP: "Selects the speed for a specific Serial peripheral", // untranslated
ARD_SPI_SETUP_CONF: "Konfiguration:", ARD_SERIAL_SPEED: ": Übertragungsgeschwindigkeit zu",
ARD_SPI_SETUP_DIVIDE: "clock divide", // untranslated ARD_SERVO_READ: "liest SERVO an PIN#",
ARD_SPI_SETUP_LSBFIRST: "LSBFIRST", // untranslated ARD_SERVO_READ_TIP: "Liest den Winkel des Servomotors aus",
ARD_SPI_SETUP_MODE: "SPI mode (idle - edge)", // untranslated ARD_SERVO_WRITE: "setzt SERVO an Pin",
ARD_SPI_SETUP_MODE0: "0 (LOW - Fallend)", ARD_SERVO_WRITE_DEG_180: "Winkel (0~180)",
ARD_SPI_SETUP_MODE1: "1 (LOW - Steigend)", ARD_SERVO_WRITE_TIP: "Set a Servo to an specified angle", // untranslated
ARD_SPI_SETUP_MODE2: "2 (HIGH - Fallend)", ARD_SERVO_WRITE_TO: "", // untranslated
ARD_SPI_SETUP_MODE3: "3 (HIGH - Steigend)", ARD_SETTONE: "Spiele Ton an Pin", // untranslated
ARD_SPI_SETUP_MSBFIRST: "MSBFIRST", // untranslated ARD_SPI_SETUP: "Setup",
ARD_SPI_SETUP_SHIFT: "data shift", // untranslated ARD_SPI_SETUP_CONF: "Konfiguration:",
ARD_SPI_SETUP_TIP: "Configures the SPI peripheral.", // untranslated ARD_SPI_SETUP_DIVIDE: "clock divide", // untranslated
ARD_SPI_TRANSRETURN_TIP: "Send a SPI message to an specified slave device and get data back.", // untranslated ARD_SPI_SETUP_LSBFIRST: "LSBFIRST", // untranslated
ARD_SPI_TRANS_NONE: "none", // untranslated ARD_SPI_SETUP_MODE: "SPI mode (idle - edge)", // untranslated
ARD_SPI_TRANS_SLAVE: "to slave pin", // untranslated ARD_SPI_SETUP_MODE0: "0 (LOW - Fallend)",
ARD_SPI_TRANS_TIP: "Send a SPI message to an specified slave device.", // untranslated ARD_SPI_SETUP_MODE1: "1 (LOW - Steigend)",
ARD_SPI_TRANS_VAL: "transfer", // untranslated ARD_SPI_SETUP_MODE2: "2 (HIGH - Fallend)",
ARD_SPI_TRANS_WARN1: "A setup block for %1 must be added to the workspace to use this block!", // untranslated ARD_SPI_SETUP_MODE3: "3 (HIGH - Steigend)",
ARD_SPI_TRANS_WARN2: "Old pin value %1 is no longer available.", // untranslated ARD_SPI_SETUP_MSBFIRST: "MSBFIRST", // untranslated
ARD_STEPPER_COMPONENT: "stepper", // untranslated ARD_SPI_SETUP_SHIFT: "data shift", // untranslated
ARD_STEPPER_DEFAULT_NAME: "MyStepper", // untranslated ARD_SPI_SETUP_TIP: "Configures the SPI peripheral.", // untranslated
ARD_STEPPER_FOUR_PINS: "4", // untranslated ARD_SPI_TRANSRETURN_TIP:
ARD_STEPPER_MOTOR: "stepper motor:", // untranslated "Send a SPI message to an specified slave device and get data back.", // untranslated
ARD_STEPPER_NUMBER_OF_PINS: "Number of pins", // untranslated ARD_SPI_TRANS_NONE: "none", // untranslated
ARD_STEPPER_PIN1: "pin1#", // untranslated ARD_SPI_TRANS_SLAVE: "to slave pin", // untranslated
ARD_STEPPER_PIN2: "pin2#", // untranslated ARD_SPI_TRANS_TIP: "Send a SPI message to an specified slave device.", // untranslated
ARD_STEPPER_PIN3: "pin3#", // untranslated ARD_SPI_TRANS_VAL: "transfer", // untranslated
ARD_STEPPER_PIN4: "pin4#", // untranslated ARD_SPI_TRANS_WARN1:
ARD_STEPPER_REVOLVS: "how many steps per revolution", // untranslated "A setup block for %1 must be added to the workspace to use this block!", // untranslated
ARD_STEPPER_SETUP: "Setup stepper motor", // untranslated ARD_SPI_TRANS_WARN2: "Old pin value %1 is no longer available.", // untranslated
ARD_STEPPER_SETUP_TIP: "Configures a stepper motor pinout and other settings.", // untranslated ARD_STEPPER_COMPONENT: "stepper", // untranslated
ARD_STEPPER_SPEED: "set speed (rpm) to", // untranslated ARD_STEPPER_DEFAULT_NAME: "MyStepper", // untranslated
ARD_STEPPER_STEP: "move stepper", // untranslated ARD_STEPPER_FOUR_PINS: "4", // untranslated
ARD_STEPPER_STEPS: "steps", // untranslated ARD_STEPPER_MOTOR: "stepper motor:", // untranslated
ARD_STEPPER_STEP_TIP: "Turns the stepper motor a specific number of steps.", // untranslated ARD_STEPPER_NUMBER_OF_PINS: "Number of pins", // untranslated
ARD_STEPPER_TWO_PINS: "2", // untranslated ARD_STEPPER_PIN1: "pin1#", // untranslated
ARD_TYPE_ARRAY: "Array", ARD_STEPPER_PIN2: "pin2#", // untranslated
ARD_TYPE_BOOL: "Boolean", ARD_STEPPER_PIN3: "pin3#", // untranslated
ARD_TYPE_CHAR: "Zeichen", ARD_STEPPER_PIN4: "pin4#", // untranslated
ARD_TYPE_CHILDBLOCKMISSING: "ChildBlockMissing", // untranslated ARD_STEPPER_REVOLVS: "how many steps per revolution", // untranslated
ARD_TYPE_DECIMAL: "Dezimalzahl", ARD_STEPPER_SETUP: "Setup stepper motor", // untranslated
ARD_TYPE_LONG: "große Zahl", ARD_STEPPER_SETUP_TIP:
ARD_TYPE_NULL: "Null", "Configures a stepper motor pinout and other settings.", // untranslated
ARD_TYPE_NUMBER: "Zahl", ARD_STEPPER_SPEED: "set speed (rpm) to", // untranslated
ARD_TYPE_SHORT: "kurze Zahl", ARD_STEPPER_STEP: "move stepper", // untranslated
ARD_TYPE_TEXT: "Text", ARD_STEPPER_STEPS: "steps", // untranslated
ARD_TYPE_UNDEF: "Undefiniert", ARD_STEPPER_STEP_TIP: "Turns the stepper motor a specific number of steps.", // untranslated
ARD_VAR_AS: "als", ARD_STEPPER_TWO_PINS: "2", // untranslated
ARD_VAR_AS_TIP: "Wert einem spezififischen Datentyp zuordnen", ARD_TYPE_ARRAY: "Array",
ARD_WRITE_TO: "zu", ARD_TYPE_BOOL: "Boolean",
NEW_INSTANCE: "Neue Instanz...", ARD_TYPE_CHAR: "Zeichen",
NEW_INSTANCE_TITLE: "Neue Instanz mit Name:", ARD_TYPE_CHILDBLOCKMISSING: "ChildBlockMissing", // untranslated
RENAME_INSTANCE: "Instanz umbenennen...", ARD_TYPE_DECIMAL: "Dezimalzahl",
RENAME_INSTANCE_TITLE: "Benenne alle '%1' Instanzen zu:", ARD_TYPE_LONG: "große Zahl",
ARD_TYPE_NULL: "Null",
} ARD_TYPE_NUMBER: "Zahl",
ARD_TYPE_SHORT: "kurze Zahl",
ARD_TYPE_TEXT: "Text",
ARD_TYPE_UNDEF: "Undefiniert",
ARD_VAR_AS: "als",
ARD_VAR_AS_TIP: "Wert einem spezififischen Datentyp zuordnen",
ARD_WRITE_TO: "zu",
NEW_INSTANCE: "Neue Instanz...",
NEW_INSTANCE_TITLE: "Neue Instanz mit Name:",
RENAME_INSTANCE: "Instanz umbenennen...",
RENAME_INSTANCE_TITLE: "Benenne alle '%1' Instanzen zu:",
};

View File

@ -1,50 +1,64 @@
export const LOGIC = { export const LOGIC = {
CONTROLS_IF_ELSEIF_TOOLTIP: "Eine weitere Bedingung hinzufügen.",
CONTROLS_IF_ELSE_TOOLTIP:
"Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft.",
CONTROLS_IF_HELPURL: "https://github.com/google/blockly/wiki/IfElse", // untranslated
CONTROLS_IF_IF_TOOLTIP: "Hinzufügen, entfernen oder sortieren von Sektionen",
CONTROLS_IF_MSG_ELSE: "sonst",
CONTROLS_IF_MSG_ELSEIF: "sonst wenn",
CONTROLS_IF_MSG_IF: "wenn",
CONTROLS_IF_TOOLTIP_1:
"Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.",
CONTROLS_IF_TOOLTIP_2:
"Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.",
CONTROLS_IF_TOOLTIP_3:
"Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.",
CONTROLS_IF_TOOLTIP_4:
"Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.",
LOGIC_BOOLEAN_HELPURL: "https://github.com/google/blockly/wiki/Logic#values", // untranslated
LOGIC_BOOLEAN_TOOLTIP: "Ist entweder wahr (true) oder falsch (false)",
LOGIC_BOOLEAN_TRUE: "wahr",
LOGIC_COMPARE_HELPURL: "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29",
LOGIC_COMPARE_TOOLTIP_EQ: "Ist wahr (true), wenn beide Werte gleich sind.",
LOGIC_COMPARE_TOOLTIP_GT:
"Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_GTE:
"Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_LT:
"Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_LTE:
"Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_NEQ:
"Ist wahr (true), wenn beide Werte unterschiedlich sind.",
LOGIC_NEGATE_HELPURL: "https://github.com/google/blockly/wiki/Logic#not", // untranslated
LOGIC_NEGATE_TITLE: "nicht %1",
LOGIC_NEGATE_TOOLTIP:
"Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist.",
LOGIC_NULL: "null",
LOGIC_NULL_HELPURL: "https://de.wikipedia.org/wiki/Nullwert",
LOGIC_NULL_TOOLTIP: "Ist NULL.",
LOGIC_OPERATION_AND: "und",
LOGIC_OPERATION_HELPURL:
"https://github.com/google/blockly/wiki/Logic#logical-operations", // untranslated
LOGIC_OPERATION_OR: "oder",
LOGIC_OPERATION_TOOLTIP_AND:
"Ist wahr (true), wenn beide Werte wahr (true) sind.",
LOGIC_OPERATION_TOOLTIP_OR:
"Ist wahr (true), wenn einer der beiden Werte wahr (true) ist.",
LOGIC_TERNARY_CONDITION: "teste",
LOGIC_TERNARY_HELPURL: "https://de.wikipedia.org/wiki/%3F:#Auswahloperator",
LOGIC_TERNARY_IF_FALSE: "wenn falsch",
LOGIC_TERNARY_IF_TRUE: "wenn wahr",
LOGIC_TERNARY_TOOLTIP:
'Überprüft eine Bedingung "teste". Wenn die Bedingung wahr ist, wird der "wenn wahr" Wert zurückgegeben, andernfalls der "wenn falsch" Wert',
CONTROLS_IF_ELSEIF_TOOLTIP: "Eine weitere Bedingung hinzufügen.", /**
CONTROLS_IF_ELSE_TOOLTIP: "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft.", * Cases
CONTROLS_IF_HELPURL: "https://github.com/google/blockly/wiki/IfElse", // untranslated */
CONTROLS_IF_IF_TOOLTIP: "Hinzufügen, entfernen oder sortieren von Sektionen", cases_do: "Führe aus",
CONTROLS_IF_MSG_ELSE: "sonst", cases_condition: "Fall (Variable): ",
CONTROLS_IF_MSG_ELSEIF: "sonst wenn", cases_switch: "Variable",
CONTROLS_IF_MSG_IF: "wenn", cases_add: "Fall",
CONTROLS_IF_TOOLTIP_1: "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.", cases_tooltip:
CONTROLS_IF_TOOLTIP_2: "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.", "Führt den entsprechenden Fall aus, wenn die Überprüfung der Variable TRUE ergibt. Über das Zahnrad kannst du weitere Fälle hinzufügen. Über den 'Default' fall kannst du bestimmen, was passieren soll wenn keiner der vorher definierten Fälle eingetreten ist.",
CONTROLS_IF_TOOLTIP_3: "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.", };
CONTROLS_IF_TOOLTIP_4: "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.",
LOGIC_BOOLEAN_HELPURL: "https://github.com/google/blockly/wiki/Logic#values", // untranslated
LOGIC_BOOLEAN_TOOLTIP: "Ist entweder wahr (true) oder falsch (false)",
LOGIC_BOOLEAN_TRUE: "wahr",
LOGIC_COMPARE_HELPURL: "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29",
LOGIC_COMPARE_TOOLTIP_EQ: "Ist wahr (true), wenn beide Werte gleich sind.",
LOGIC_COMPARE_TOOLTIP_GT: "Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_GTE: "Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_LT: "Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_LTE: "Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_NEQ: "Ist wahr (true), wenn beide Werte unterschiedlich sind.",
LOGIC_NEGATE_HELPURL: "https://github.com/google/blockly/wiki/Logic#not", // untranslated
LOGIC_NEGATE_TITLE: "nicht %1",
LOGIC_NEGATE_TOOLTIP: "Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist.",
LOGIC_NULL: "null",
LOGIC_NULL_HELPURL: "https://de.wikipedia.org/wiki/Nullwert",
LOGIC_NULL_TOOLTIP: "Ist NULL.",
LOGIC_OPERATION_AND: "und",
LOGIC_OPERATION_HELPURL: "https://github.com/google/blockly/wiki/Logic#logical-operations", // untranslated
LOGIC_OPERATION_OR: "oder",
LOGIC_OPERATION_TOOLTIP_AND: "Ist wahr (true), wenn beide Werte wahr (true) sind.",
LOGIC_OPERATION_TOOLTIP_OR: "Ist wahr (true), wenn einer der beiden Werte wahr (true) ist.",
LOGIC_TERNARY_CONDITION: "teste",
LOGIC_TERNARY_HELPURL: "https://de.wikipedia.org/wiki/%3F:#Auswahloperator",
LOGIC_TERNARY_IF_FALSE: "wenn falsch",
LOGIC_TERNARY_IF_TRUE: "wenn wahr",
LOGIC_TERNARY_TOOLTIP: "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist, wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert",
/**
* Cases
*/
cases_do: "Führe aus",
cases_condition: "Fall (Variable): ",
cases_switch: "Variable",
cases_add: "Fall",
cases_tooltip: "Führt den entsprechenden Fall aus, wenn die Überprüfung der Variable TRUE ergibt. Über das Zahnrad kannst du weitere Fälle hinzufügen. Über den 'Default' fall kannst du bestimmen, was passieren soll wenn keiner der vorher definierten Fälle eingetreten ist.",
}

View File

@ -27,7 +27,7 @@ export const BLE = {
sensebox_phyphox_graphStyle: "Stil", sensebox_phyphox_graphStyle: "Stil",
sensebox_phyphox_init_tooltip: sensebox_phyphox_init_tooltip:
"Initialisere das Bluetooth Bee. Stecke diese auf dem Steckplatz **XBEE1**. Gib dem Phphox Messgerät einen eindeutigen Namen, damit du dieses in der App wiederfindest", "Initialisere das Bluetooth Bee. Stecke diese auf dem Steckplatz **XBEE1**. Gib dem Phyphox Messgerät einen eindeutigen Namen, damit du dieses in der App wiederfindest",
sensebox_phyphox_experiment_tooltip: sensebox_phyphox_experiment_tooltip:
"Erstelle ein Experiment und vergib einen eindeutigen Namen und eine kurze Beschreibung. Füge bis zu 5 verschiedene Graphen in der Ansicht hinzu. ", "Erstelle ein Experiment und vergib einen eindeutigen Namen und eine kurze Beschreibung. Füge bis zu 5 verschiedene Graphen in der Ansicht hinzu. ",
sensebox_phyphox_graph_tooltip: sensebox_phyphox_graph_tooltip:

View File

@ -1,44 +1,59 @@
export const LORA = { export const LORA = {
/* /*
* LoRa Blöcke * LoRa Blöcke
*/ */
senseBox_LoRa_connect: "Zu TTN senden", senseBox_LoRa_connect: "Zu TTN senden",
senseBox_LoRa_device_id: "Device EUI (lsb)", senseBox_LoRa_device_id: "Device EUI (lsb)",
senseBox_LoRa_app_id: "Application EUI (lsb)", senseBox_LoRa_app_id: "Application EUI (lsb)",
senseBox_LoRa_app_key: "App Key (msb)", senseBox_LoRa_app_key: "App Key (msb)",
senseBox_LoRa_nwskey_id: "Network Session Key (msb)", senseBox_LoRa_nwskey_id: "Network Session Key (msb)",
senseBox_LoRa_appskey_id: "App Session Key (msb)", senseBox_LoRa_appskey_id: "App Session Key (msb)",
senseBox_LoRa_devaddr_id: "Device Adress", senseBox_LoRa_devaddr_id: "Device Adress",
senseBox_LoRa_interval: "Intervall in Minuten", senseBox_LoRa_interval: "Intervall in Minuten",
senseBox_measurement: "Messung", senseBox_measurement: "Messung",
senseBox_measurements: "Messungen", senseBox_measurements: "Messungen",
senseBox_LoRa_send_message: "Sende als Lora Nachricht", senseBox_LoRa_send_message: "Sende als Lora Nachricht",
senseBox_LoRa_send_cayenne: "Sende als Cayenne Nachricht", senseBox_LoRa_send_cayenne: "Sende als Cayenne Nachricht",
senseBox_LoRa_cayenne_temperature: "Temperatur", senseBox_LoRa_cayenne_temperature: "Temperatur",
senseBox_LoRa_cayenne_channel: "Kanal", senseBox_LoRa_cayenne_channel: "Kanal",
senseBox_LoRa_cayenne_humidity: "Luftfeuchtigkeit", senseBox_LoRa_cayenne_humidity: "Luftfeuchtigkeit",
senseBox_LoRa_cayenne_pressure: "Luftdruck", senseBox_LoRa_cayenne_pressure: "Luftdruck",
senseBox_LoRa_cayenne_luminosity: "Helligkeit", senseBox_LoRa_cayenne_luminosity: "Helligkeit",
senseBox_LoRa_cayenne_analog: "Analoger Wert", senseBox_LoRa_cayenne_analog: "Analoger Wert",
senseBox_LoRa_cayenne_x: "X Wert", senseBox_LoRa_cayenne_x: "X Wert",
senseBox_LoRa_cayenne_y: "Y Wert", senseBox_LoRa_cayenne_y: "Y Wert",
senseBox_LoRa_cayenne_z: "Z Wert", senseBox_LoRa_cayenne_z: "Z Wert",
senseBox_LoRa_cayenne_lat: "Breitengrad", senseBox_LoRa_cayenne_lat: "Breitengrad",
senseBox_LoRa_cayenne_lng: "Längengrad", senseBox_LoRa_cayenne_lng: "Längengrad",
senseBox_LoRa_cayenne_alt: "Höhe", senseBox_LoRa_cayenne_alt: "Höhe",
senseBox_LoRa_cayenne_concentration: "Konzentration",
senseBox_LoRa_cayenne_tip: "Sende Daten als Cayenne Payload Format", senseBox_LoRa_cayenne_tip: "Sende Daten als Cayenne Payload Format",
senseBox_LoRa_cayenne_gps_tip: "Sende GPS", senseBox_LoRa_cayenne_gps_tip: "Sende GPS",
senseBox_LoRa_cayenne_temperature_tip: "Sendet Temperaturwert mit einer Nachkommastelle", senseBox_LoRa_cayenne_temperature_tip:
senseBox_LoRa_cayenne_pressure_tip: "Sendet Luftdruck mit einer Nachkommastelle", "Sendet Temperaturwert mit einer Nachkommastelle",
senseBox_LoRa_cayenne_luminosity_tip: "Sendet Helligkeitswert", senseBox_LoRa_cayenne_pressure_tip:
senseBox_LoRa_cayenne_analog_tip: "Sendet einen Dezimalwert mit einer Nachkommastelle", "Sendet Luftdruck mit einer Nachkommastelle",
senseBox_LoRa_cayenne_luminosity_tip: "Sendet Helligkeitswert",
senseBox_LoRa_cayenne_analog_tip:
"Sendet einen Dezimalwert mit einer Nachkommastelle",
senseBox_LoRa_message_tooltip: "Sende eine Nachricht über LoRa", senseBox_LoRa_cayenne_concentration_tip: "Sendet eine Konzentration in PPM",
senseBox_LoRa_sensor_tip: "Sende einen Sensorwert mit einer bestimmten Anzahl an Bytes",
senseBox_LoRa_init_abp_tooltip: "Initialisiere die LoRa übertragung. Die Aktivierung erfolgt über ABP. Registriere eine Application auf [thethingsnetwork](https://thethingsnetwork.com) und kopiere den **Network Session Key** und den **App Session Key** im **msb Format** und die **Device ID** im **hex Format**.", senseBox_LoRa_message_tooltip: "Sende eine Nachricht über LoRa",
senseBox_LoRa_init_helpurl: "https://docs.sensebox.de/blockly/blockly-web-lora/", senseBox_LoRa_sensor_tip:
senseBox_LoRa_init_otaa_tooltip: "Initialisiere die LoRa übertragung. Die Aktivierung erfolgt über OTAA. Registriere eine Application auf [thethingsnetwork](https://thethingsnetwork.com) und kopiere die **DEVICE EUI** und die **Application EUI** im **lsb Format** den **App Key** im **msb Format**.", "Sende einen Sensorwert mit einer bestimmten Anzahl an Bytes",
} senseBox_LoRa_init_abp_tooltip:
"Initialisiere die LoRa übertragung. Die Aktivierung erfolgt über ABP. Registriere eine Application auf [thethingsnetwork](https://thethingsnetwork.com) und kopiere den **Network Session Key** und den **App Session Key** im **msb Format** und die **Device ID** im **hex Format**.",
senseBox_LoRa_init_helpurl:
"https://docs.sensebox.de/blockly/blockly-web-lora/",
senseBox_LoRa_init_otaa_tooltip:
"Initialisiere die LoRa übertragung. Die Aktivierung erfolgt über OTAA. Registriere eine Application auf [thethingsnetwork](https://thethingsnetwork.com) und kopiere die **DEVICE EUI** und die **Application EUI** im **lsb Format** den **App Key** im **msb Format**.",
sensebox_lora_ttn_mapper_tip:
"Mit einem TTN Mapper kannst du die LoRa-Netzabdeckung in deiner Umgebung aufzeichnen. Die Daten werden dann auf [ttnmaper](https://ttnmapper.org) angezeigt. Den notwendigen Decoder findest du [hier](https://gist.github.com/felixerdy/f959ac03df98c6947f1c7f35d537f23e#file-decoder-js).",
sensebox_lora_ttn_mapper_helpurl:
"https://sensebox.de/projects/de/2020-03-06-ttn-mapper",
};

View File

@ -0,0 +1,48 @@
export const MOTORS = {
/**
* Motors
*/
sensebox_motors_beginServoMotor: "Initialisiere Servomotor",
sensebox_motors_beginServoMotor_pin: "Pin:",
sensebox_motors_beginServoMotor_tooltip: "Verbinde einen digitalen Pin mit dem orangen Kabel des Servomotrors. Verbinde zusätzlich GND mit GND (schwarzes und braunes Kabel) und 5V mit 5V (rotes Kabel).",
sensebox_motors_beginServoMotor_helpurl: "https://de.wikipedia.org/wiki/Servomotor",
sensebox_motors_moveServoMotor: "Bewege Servomotor",
sensebox_motors_moveServoMotor_pin: "Pin:",
sensebox_motors_moveServoMotor_degrees: "Winkel in Grad:",
sensebox_motors_moveServoMotor_tooltip: "Der Servomotor kann zwischen 0 und 180 Grad bewegt werden.",
sensebox_motors_moveServoMotor_helpurl: "https://de.wikipedia.org/wiki/Servomotor",
sensebox_motors_I2CMotorBoard_begin: "Initialize I2C Motor Board",
sensebox_motors_I2CMotorBoard_begin_tooltip: "Connect the I2C Moztor Board with the two DC Motors to one of the five I2C-Ports. Use this Block inside the setup()-function.",
sensebox_motors_I2CMotorBoard_begin_helpurl: "TODO",
sensebox_motors_I2CMotorBoard_moveDCMotor: "Move",
sensebox_motors_I2CMotorBoard_moveDCMotor_left: "left",
sensebox_motors_I2CMotorBoard_moveDCMotor_right: "right",
sensebox_motors_I2CMotorBoard_moveDCMotor_motor: "DC Motor at I2C Motor Board",
sensebox_motors_I2CMotorBoard_moveDCMotor_speed: "Speed:",
sensebox_motors_I2CMotorBoard_moveDCMotor_tooltip: "You can set the Speed between -100 and 100.",
sensebox_motors_I2CMotorBoard_moveDCMotor_helpurl: "TODO",
sensebox_motors_I2CMotorBoard_stopDCMotor: "Stop ",
sensebox_motors_I2CMotorBoard_stopDCMotor_left: "left",
sensebox_motors_I2CMotorBoard_stopDCMotor_right: "right",
sensebox_motors_I2CMotorBoard_stopDCMotor_motor: "DC Motor at I2C Motor Board",
sensebox_motors_I2CMotorBoard_stopDCMotor_tooltip: "TODO",
sensebox_motors_I2CMotorBoard_stopDCMotor_helpurl: "TODO",
sensebox_motors_beginStepperMotor: "Initialize Stepper Motor (28BYJ-48)",
sensebox_motors_beginStepperMotor_rpm: "Rotations per Minute:",
sensebox_motors_beginStepperMotor_pins: "Input Pins (IN1-IN4):",
sensebox_motors_beginStepperMotor_tooltip: "Connect four of the the digital pins in the right order to the inputs IN1-IN4 on the stepper motor board. Connect a GND pin (black wire) to the minus pin and a 5V pin (red wire) to the plus pin on the board. Also connect the stepper motor to this Board. Use this Block inside the setup()-function.",
sensebox_motors_beginStepperMotor_helpurl: "TODO",
sensebox_motors_moveStepperMotor: "Move Stepper Motor (28BYJ-48)",
sensebox_motors_moveStepperMotor_step: "Steps:",
sensebox_motors_moveStepperMotor_tooltip: "Move stepper motor. 2048 steps equal a full rotation.",
sensebox_motors_moveStepperMotor_helpurl: "TODO",
};

View File

@ -0,0 +1,11 @@
export const NTP = {
sensebox_ntp_init: "Initialisiere NTP",
sensebox_ntp_init_tooltip: "Initialisiere den NTP Server.",
sensebox_ntp_get: "Hole Zeit von NTP Server: ",
sensebox_ntp_get_timestamp_tooltip:
"Gibt dir einen in ISO 8601 formatierten Zeitstempel zurück. Bsp: 2021-12-24T18:21Z",
sensebox_ntp_get_tooltip:
"Gibt dir den ausgewählten Wert zurück. Unix Zeit entspricht der Anzahl der Sekunden seit dem 1.1.1970",
sensebox_ntp_epochTime: "Unix Zeit",
sensebox_ntp_formattedTimeStamp: "Zeitstempel (hh:mm:ss)",
};

View File

@ -1,17 +1,23 @@
export const OSEM = { export const OSEM = {
/** /**
* openSenseMap * openSenseMap
*/ */
senseBox_osem_connection_tip: "stellt eine WLAN verbindung her", senseBox_osem_connection_tip:
senseBox_send_to_osem_tip: "sende Messwert an", "Verwende diesen Block, um deine senseBox mit der openSenseMap zu verbinden. Registriere deine senseBox auf der openSenseMap und trage die IDs und den API-Schlüssel ein. Verwende anschließend den Block ***Sende Messwert an die openSenseMap*** und die Sensor-ID, um die Messwerte zu übertragen.",
senseBox_send_to_osem: "Sende Messwert an die openSenseMap", senseBox_osem_connection_helpurl: "https://www.opensensemap.org/",
senseBox_osem_connection: "Verbinde mit openSenseMap:", senseBox_send_to_osem_tip:
senseBox_osem_host: "opensensemap.org", "Sende mit diesem Block Messwerte an die openSenseMap. Verwende pro Messwert einen Block und trage die zugewiesene Sensor ID ein",
senseBox_osem_host_workshop: "workshop.opensensemap.org", senseBox_send_to_osem: "Sende Messwert an die openSenseMap",
senseBox_osem_exposure: "Typ", senseBox_osem_connection: "Verbinde mit openSenseMap:",
senseBox_osem_stationary: "Stationär", senseBox_osem_host: "opensensemap.org",
senseBox_osem_mobile: "Mobil", senseBox_osem_host_workshop: "workshop.opensensemap.org",
senseBox_osem_access_token: "API Schlüssel", senseBox_osem_exposure: "Typ",
senseBox_send_mobile_to_osem: "Sende Messwert und Standort an die openSenseMap", senseBox_osem_stationary: "Stationär",
senseBox_send_mobile_to_osem_tip: "Sende Messwert und Standort an die openSenseMap", senseBox_osem_mobile: "Mobil",
} senseBox_osem_access_token: "API Schlüssel",
senseBox_send_mobile_to_osem:
"Sende Messwert und Standort an die openSenseMap",
senseBox_send_mobile_to_osem_tip:
"Sende Messwert und Standort an die openSenseMap",
senseBox_osem_restart: "Bei Verbindungsverlust Gerät neustarten?",
};

View File

@ -1,14 +1,14 @@
export const RTC = { export const RTC = {
sensebox_rtc_init: "Initialisiere RTC", sensebox_rtc_init: "Initialisiere externe RTC",
sensebox_rtc_init_tooltip: sensebox_rtc_init_tooltip:
"Initialisiere die RTC. Schließe diese an einen der 5 I2C/Wire Anschlüsse an und lege die Batterie ein. Bevor du die Uhrzeit auslesen kannst muss diese zunächst einmal gesetzt werden. Dieser Schritt muss normalerweise nur einmalig durchgeführt werden.", "Initialisiere die RTC. Schließe diese an einen der 5 I2C/Wire Anschlüsse an und lege die Batterie ein. Bevor du die Uhrzeit auslesen kannst muss diese zunächst einmal gesetzt werden. Dieser Schritt muss normalerweise nur einmalig durchgeführt werden.",
sensebox_rtc_set: "Setze Uhrzeit/Datum der RTC", sensebox_rtc_set: "Setze Uhrzeit/Datum der externen RTC",
sensebox_rtc_set_tooltip: sensebox_rtc_set_tooltip:
"Stellt die Uhrzeit der RTC ein. Beachte, dass du diesen Block im Setup ausführst.", "Stellt die Uhrzeit der RTC ein. Beachte, dass du diesen Block im Setup ausführst.",
sensebox_rtc_get_timestamp: "Zeitstempel", sensebox_rtc_get_timestamp: "Zeitstempel externe RTC (RFC 3339)",
sensebox_rtc_get_timestamp_tooltip: sensebox_rtc_get_timestamp_tooltip:
"Gibt dir einen in ISO 8601 formatierten Zeitstempel zurück. Bsp: 2021-12-24T18:21Z", "Gibt dir einen in ISO 8601 formatierten Zeitstempel zurück. Bsp: 2021-12-24T18:21Z",
sensebox_rtc_get: "Wert: ", sensebox_rtc_get: "Wert (externe RTC): ",
sensebox_rtc_get_tooltip: "Gibt dir den ausgewählten Wert zurück.", sensebox_rtc_get_tooltip: "Gibt dir den ausgewählten Wert zurück.",
sensebox_rtc_second: "Sekunden", sensebox_rtc_second: "Sekunden",
sensebox_rtc_minutes: "Minuten", sensebox_rtc_minutes: "Minuten",
@ -16,4 +16,22 @@ export const RTC = {
sensebox_rtc_day: "Tag", sensebox_rtc_day: "Tag",
sensebox_rtc_month: "Monat", sensebox_rtc_month: "Monat",
sensebox_rtc_year: "Jahr", sensebox_rtc_year: "Jahr",
sensebox_internal_rtc_init: "Initialisiere interne RTC",
sensebox_internal_rtc_init_tooltip:
"Initialisieren der internen RTC. Diese RTC ist nicht batteriegepuffert und wird bei jedem Einschaltvorgang zurückgesetzt",
sensebox_internal_rtc_set: "Setze interne RTC Zeit/Datum (Unix Time)",
sensebox_internal_rtc_set_tooltip:
"Setzt die Zeit der internen RTC. Führe den Block einmalig im Setup aus und setzte die Uhrzeit über die Unix Zeit.",
sensebox_internal_rtc_get: "Wert (interne RTC): ",
sensebox_internal_rtc_get_timestamp: "Zeitstempel interne RTC (RFC 3339)",
sensebox_internal_rtc_get_timestamp_tooltip:
"Returns a timestamp formatted in ISO 8601. Ex: 2021-12-24T18:21Z",
sensebox_internal_rtc_get_tooltip: "Gibt den ausgewählten Wert zurück",
sensebox_internal_rtc_epoch: "Unix Zeit",
sensebox_internal_rtc_year: "Jahr",
sensebox_internal_rtc_month: "Monat",
sensebox_internal_rtc_day: "Tag",
sensebox_internal_rtc_hour: "Stunde",
sensebox_internal_rtc_minutes: "Minute",
sensebox_internal_rtc_seconds: "Sekunde",
}; };

View File

@ -1,13 +1,25 @@
export const SD = { export const SD = {
/** /**
* SD-Block * SD-Block
*/ */
senseBox_sd_create_file: "Erstelle Datei auf SD-Karte", senseBox_sd_create_file: "Erstelle Datei auf SD-Karte",
senseBox_sd_write_file: "Schreibe Daten auf SD-Karte", sensebox_sd_helpurl: "https://docs.sensebox.de/hardware/bee-sd/",
senseBox_sd_open_file: "Öffne eine Datei auf der SD-Karte", senseBox_sd_write_file: "Schreibe Daten auf SD-Karte",
senseBox_sd_create_file_tooltip: "Erstellt eine Datei auf der Karte. Stecke das SD-Bee auf den Steckplatz **XBEE2**. Die **maximale** Länge des Dateinamen sind **8 Zeichen**. Die Datei sollte zuerst im *Setup()* erstellt werden", senseBox_sd_open_file: "Öffne eine Datei auf der SD-Karte",
senseBox_sd_write_file_tooptip: "Schreibe Daten auf die SD-Karte. Beachte, dass die Datei zuerst geöffnet werden muss.", senseBox_sd_create_file_tooltip:
senseBox_sd_open_file_tooltip: "Öffne die Datei auf der SD-Karte, um Dateien zu speichern. Am Ende der Schleife wird die Datei automatisch wieder geschlossen.", "Erstellt eine Datei auf der Karte. Stecke das SD-Bee auf den Steckplatz **XBEE2**. Die **maximale** Länge des Dateinamen sind **8 Zeichen**. Die Datei sollte zuerst im *Setup()* erstellt werden",
sensebox_sd_filename: "Daten", senseBox_sd_write_file_tooptip:
senseBox_sd_decimals: "Dezimalen", "Schreibe Daten auf die SD-Karte. Beachte, dass die Datei zuerst geöffnet werden muss.",
} senseBox_sd_open_file_tooltip:
"Öffne die Datei auf der SD-Karte, um Dateien zu speichern. Am Ende der Schleife wird die Datei automatisch wieder geschlossen.",
sensebox_sd_filename: "Daten",
senseBox_sd_decimals: "Dezimalen",
sensebox_sd_osem: "Erstelle CSV-Datei für openSenseMap",
sensebox_sd_osem_tip:
"Erstellt eine CSV-Datei, die später auf die openSenseMap hochgeladen werden kann. ",
sensebox_sd_save_for_osem: "Speichere Messwert",
sensebox_sd_save_for_osem_tip:
"Füge eine Messung mit Sensor ID zur CSV-Datei hinzu",
sensebox_sd_save_for_osem_id: "Sensor ID:",
sensebox_sd_measurement: "Messwerte",
};

View File

@ -1,129 +1,148 @@
export const SENSORS = { export const SENSORS = {
/** /**
* Sensors * Sensors
* --------------------------------------------------- * ---------------------------------------------------
* *
*/ */
/** /**
* BMP280 * BMP280
*/ */
senseBox_pressure_sensor: "Luftdruck-/Temperatursensor (BMP280)", senseBox_pressure_sensor: "Luftdruck-/Temperatursensor (BMP280)",
senseBox_pressure: "Luftdruck in Pa", senseBox_pressure: "Luftdruck in hPa",
senseBox_pressure_dimension: "Luftdruck in Pa", senseBox_pressure_dimension: "Luftdruck in hPa",
senseBox_pressure_tip: "Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für den Luftdruck in Pa. Um die korrekte Höhe über NN zu berechnen benötigt der Sensor einen aktuellen Referenzwert.", senseBox_pressure_tooltip:
senseBox_pressure_referencePressure: "Luftdruck auf NN", "Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für den Luftdruck in hPa. Um die korrekte Höhe über NN zu berechnen benötigt der Sensor einen aktuellen Referenzwert.",
senseBox_pressure_referencePressure_dim: "hPa", senseBox_pressure_referencePressure: "Luftdruck auf NN",
senseBox_pressure_helpurl: "", senseBox_pressure_referencePressure_dim: "hPa",
senseBox_pressure_helpurl:
"https://docs.sensebox.de/hardware/sensoren-luftdruck-temperatur/",
/**
* DPS310
*/
senseBox_sensor_dps310: "Luftdruck-/Temperatursensor (DPS310)",
senseBox_sensor_dps310_tooltip:
"Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für den Luftdruck in hPa. Um die korrekte Höhe über NN zu berechnen benötigt der Sensor einen aktuellen Referenzwert.",
senseBox_sensor_dps310_helpurl: "",
/** /**
* Mikro * Mikro
*/ */
senseBox_sound: "Mikrofon", senseBox_sound: "Mikrofon",
senseBox_sound_tip: "Schließe den Sensor über das Breadbord an einen der 3 **analog/digital** Ports an. Gibt den Messwert des Mikrofons in Volt zurück", senseBox_sound_tip:
senseBox_sound_helpurl: "https://docs.sensebox.de/hardware/sensoren-mikro/", "Schließe den Sensor über das Breadbord an einen der 3 **analog/digital** Ports an. Gibt den Messwert des Mikrofons in Volt zurück",
senseBox_sound_helpurl: "https://docs.sensebox.de/hardware/sensoren-mikro/",
/** /**
* Temperature and Humidity Sensor (HDC1080) * Temperature and Humidity Sensor (HDC1080)
*/ */
senseBox_temp: "Temperatur in °C", senseBox_temp: "Temperatur in °C",
senseBox_temp_hum: "Temperatur-/Luftfeuchtigkeitssensor (HDC1080)", senseBox_temp_hum: "Temperatur-/Luftfeuchtigkeitssensor (HDC1080)",
senseBox_temp_hum_tooltip: "Dieser Block gibt dir die Messwerte des Temperatur- und Luftfeuchtigkeitssensor zurück. Schließe den Sensor an einen der 5 I2C Anschlüsse an. Messwert wird mit 2 Nachkommastellen ausgegeben.", senseBox_temp_hum_tooltip:
senseBox_temp_hum_helpurl: "https://docs.sensebox.de/hardware/sensoren-temperatur-luftfeuchte/", "Dieser Block gibt dir die Messwerte des Temperatur- und Luftfeuchtigkeitssensor zurück. Schließe den Sensor an einen der 5 I2C Anschlüsse an. Messwert wird mit 2 Nachkommastellen ausgegeben.",
senseBox_temp_hum_helpurl:
"https://docs.sensebox.de/hardware/sensoren-temperatur-luftfeuchte/",
/** /**
* Ultraschalldistanzsensor * Ultraschalldistanzsensor
*/ */
senseBox_ultrasonic: "Ultraschall-Abstandssensor an Port", senseBox_ultrasonic: "Ultraschall-Abstandssensor an Port",
senseBox_ultrasonic_trigger: "Trigger", senseBox_ultrasonic_trigger: "Trigger",
senseBox_ultrasonic_echo: "Echo", senseBox_ultrasonic_echo: "Echo",
senseBox_ultrasonic_port_A: "A", senseBox_ultrasonic_maxDistance: "Maximale Distanz",
senseBox_ultrasonic_port_B: "B", senseBox_ultrasonic_port_A: "A",
senseBox_ultrasonic_port_C: "C", senseBox_ultrasonic_port_B: "B",
senseBox_ultrasonic_tooltip: `Misst die Distanz mithilfe von Ultraschall in cm. Schließe den Sensor an einen der drei Digital/Analog Ports an: senseBox_ultrasonic_port_C: "C",
senseBox_ultrasonic_tooltip: `Misst die Distanz mithilfe von Ultraschall in cm. Schließe den Sensor an einen der drei Digital/Analog Ports an:
- Trigger: Grünes Kabel - Trigger: Grünes Kabel
- Echo: gelbes Kabel`, - Echo: gelbes Kabel
senseBox_ultrasonic_helpurl: "https://docs.sensebox.de/hardware/sensoren-distanz/", Wenn die maximale Distanz überschritten wird, wird ein Wert von **O** ausgegeben`,
/** senseBox_ultrasonic_helpurl:
* UV and Lightsensor "https://docs.sensebox.de/hardware/sensoren-distanz/",
*/ /**
senseBox_value: "Messwert:", * UV and Lightsensor
senseBox_uv_light: "Helligkeit-/UV-Sensor", */
senseBox_uv_light_tooltip: "Sensor misst UV-Licht oder die Helligkeit. Die Helligkeit wird als **Ganzezahl** in Lux ausgegeben. Die UV-Intensität als **Kommazahl** in µW/cm².", senseBox_value: "Messwert:",
senseBox_uv: "UV-Intensität in µW/cm²", senseBox_uv_light: "Helligkeit-/UV-Sensor",
senseBox_light: "Beleuchtungsstärke in Lux", senseBox_uv_light_tooltip:
senseBox_uv_light_helpurl: "https://docs.sensebox.de/hardware/sensoren-helligkeit-uv/", "Sensor misst UV-Licht oder die Helligkeit. Die Helligkeit wird als **Ganzezahl** in Lux ausgegeben. Die UV-Intensität als **Kommazahl** in µW/cm².",
senseBox_uv: "UV-Intensität in µW/cm²",
senseBox_light: "Beleuchtungsstärke in Lux",
senseBox_uv_light_helpurl:
"https://docs.sensebox.de/hardware/sensoren-helligkeit-uv/",
/** /**
* BMX055 * BMX055
*/ */
senseBox_bmx055_compass: "Lage Sensor", senseBox_bmx055_compass: "Lage Sensor",
senseBox_bmx055_accelerometer: "Beschleunigungssensor", senseBox_bmx055_accelerometer: "Beschleunigungssensor",
senseBox_bmx055_accelerometer_range: "Messbereich", senseBox_bmx055_accelerometer_range: "Messbereich",
senseBox_bmx055_accelerometer_range_2g: "2g", senseBox_bmx055_accelerometer_range_2g: "2g",
senseBox_bmx055_accelerometer_range_4g: "4g", senseBox_bmx055_accelerometer_range_4g: "4g",
senseBox_bmx055_accelerometer_range_8g: "8g", senseBox_bmx055_accelerometer_range_8g: "8g",
senseBox_bmx055_accelerometer_range_16g: "16g", senseBox_bmx055_accelerometer_range_16g: "16g",
senseBox_bmx055_accelerometer_direction: "Richtung", senseBox_bmx055_accelerometer_direction: "Richtung",
senseBox_bmx055_accelerometer_direction_x: "X-Achse", senseBox_bmx055_accelerometer_direction_x: "X-Achse",
senseBox_bmx055_accelerometer_direction_y: "Y-Achse", senseBox_bmx055_accelerometer_direction_y: "Y-Achse",
senseBox_bmx055_accelerometer_direction_z: "Z-Achse", senseBox_bmx055_accelerometer_direction_z: "Z-Achse",
senseBox_bmx055_accelerometer_direction_total: "Gesamt", senseBox_bmx055_accelerometer_direction_total: "Gesamt",
senseBox_bmx055_gyroscope: "Lage Sensor", senseBox_bmx055_gyroscope: "Lage Sensor",
senseBox_bmx055_accelerometer_tip: "Lage Sensor", senseBox_bmx055_accelerometer_tip: "Lage Sensor",
senseBox_bmx055_compass_tip: "Lage Sensor", senseBox_bmx055_compass_tip: "Lage Sensor",
senseBox_bmx055_gyroscope_tip: "Lage Sensor", senseBox_bmx055_gyroscope_tip: "Lage Sensor",
senseBox_bmx055_x: "X-Richtung", senseBox_bmx055_x: "X-Richtung",
senseBox_bmx055_y: "Y-Richtung", senseBox_bmx055_y: "Y-Richtung",
senseBox_bmx055_accelerometer_tooltip: `Dieser Block gibt dir den Messwert des Beschleunigungssensors der direkt auf der senseBox MCU aufgelötet ist. Im Dropdown Menü kannst du die Richtung und den Messbereich auswählen.`, senseBox_bmx055_accelerometer_tooltip: `Dieser Block gibt dir den Messwert des Beschleunigungssensors der direkt auf der senseBox MCU aufgelötet ist. Im Dropdown Menü kannst du die Richtung und den Messbereich auswählen.`,
senseBox_bmx055_helpurl: "", senseBox_bmx055_helpurl: "",
/**
/** *
* * GPS
* GPS */
*/ senseBox_gps_getValues: "GPS Modul",
senseBox_gps_getValues: "GPS Modul", senseBox_gps_lat: "Breitengrad",
senseBox_gps_lat: "Breitengrad", senseBox_gps_lng: "Längengrad",
senseBox_gps_lng: "Längengrad", senseBox_gps_alt: "Höhe über NN in m",
senseBox_gps_alt: "Höhe über NN in m", senseBox_gps_speed: "Geschwindigkeit in km/h",
senseBox_gps_speed: "Geschwindigkeit in km/h", senseBox_gps_date: "Datum",
senseBox_gps_date: "Datum", senseBox_gps_time: "Uhrzeit",
senseBox_gps_time: "Uhrzeit", senseBox_gps_timeStamp: "Zeitstempel (RFC 3339)",
senseBox_gps_timeStamp: "Zeitstempel (RFC 3339)", senseBox_gps_tooltip: `Liest das GPS Modul aus und gibt dir die Standortinformationen. Längen- und Breitengrad werden als Kommazahl mit 6 Nachkommastellen ausgegeben.
senseBox_gps_tooltip: `Liest das GPS Modul aus und gibt dir die Standortinformationen. Längen- und Breitengrad werden als Kommazahl mit 6 Nachkommastellen ausgegeben.
**Anschluss: I2C** **Anschluss: I2C**
**Beachte:** Das GPS Modul benöigt beim ersten Verwenden relativ lange (ca. 5-10 Minuten) bis es deinen Standort gefunden hat! **Beachte:** Das GPS Modul benöigt beim ersten Verwenden relativ lange (ca. 5-10 Minuten) bis es deinen Standort gefunden hat!
`, `,
senseBox_gps_helpurl: "https://docs.sensebox.de/hardware/sensoren-gps/", senseBox_gps_helpurl: "https://docs.sensebox.de/hardware/sensoren-gps/",
/** /**
* Windspeed * Windspeed
*/ */
senseBox_windspeed: "Windgeschwindigkeitssensor", senseBox_windspeed: "Windgeschwindigkeitssensor",
senseBox_windspeed_tooltip: "", senseBox_windspeed_tooltip: "",
/* /*
* Soundsensor * Soundsensor
*/ */
senseBox_soundsensor_dfrobot: "Soundsensor (DF Robot)", senseBox_soundsensor_dfrobot: "Soundsensor (DF Robot)",
senseBox_soundsensor_dfrobot_tooltip: "Schließe den Sensor an einen der 3 **digital/analog Ports** an. Der Sensor gibt dir den Messwert in dB mit einer Nachkommastelle", senseBox_soundsensor_dfrobot_tooltip:
senseBox_soundsensor_dfrobot_helpurl: "https://docs.sensebox.de/hardware/sensoren-lautstaerke/", "Schließe den Sensor an einen der 3 **digital/analog Ports** an. Der Sensor gibt dir den Messwert in dB mit einer Nachkommastelle",
/* senseBox_soundsensor_dfrobot_helpurl:
* BME680 "https://docs.sensebox.de/hardware/sensoren-lautstaerke/",
*/ /*
* BME680
*/
senseBox_bme680: "Umweltsensor (BME680)", senseBox_bme680: "Umweltsensor (BME680)",
senseBox_bme_iaq: "Innenraumluftqualität (IAQ)", senseBox_bme_iaq: "Innenraumluftqualität (IAQ)",
senseBox_bme_iaq_accuracy: "Kalibrierungswert", senseBox_bme_iaq_accuracy: "Kalibrierungswert",
senseBox_bme_co2: "CO2 Äquivalent", senseBox_bme_co2: "CO2 Äquivalent",
senseBox_bme_breatheVocEquivalent: "Atemluft VOC Äquivalent", senseBox_bme_pressure: "Luftdruck in Pa",
senseBox_bme_tooltip: `Schließe den Umweltsensor an einen der 5 **I2C-Anschlüsse** an. **Beachte:** Der Sensor benöigt eine gewisse Zeit zum kalibrieren. senseBox_bme_breatheVocEquivalent: "Atemluft VOC Äquivalent",
senseBox_bme_tooltip: `Schließe den Umweltsensor an einen der 5 **I2C-Anschlüsse** an. **Beachte:** Der Sensor benöigt eine gewisse Zeit zum kalibrieren.
Den Status der Kalibrierung kann über den Kalibrierungswert abgelesen werden. Er ist entweder 0, 1, 2 oder 3 und sagt folgendes aus: Den Status der Kalibrierung kann über den Kalibrierungswert abgelesen werden. Er ist entweder 0, 1, 2 oder 3 und sagt folgendes aus:
- IAQ Accuracy : 0 heißt Sensor wird stabilisiert (dauert ca. 25 Minuten) oder dass es eine Zeitüberschreitung gab, - IAQ Accuracy : 0 heißt Sensor wird stabilisiert (dauert ca. 25 Minuten) oder dass es eine Zeitüberschreitung gab,
@ -132,49 +151,73 @@ Den Status der Kalibrierung kann über den Kalibrierungswert abgelesen werden. E
- IAQ Accuracy : 3 heißt Sensor erfolgreich kalibriert. - IAQ Accuracy : 3 heißt Sensor erfolgreich kalibriert.
Die Messwerte für Temperatur, Luftfeuchtigkeit und Luftdruck können direkt verwendet werden.`, Die Messwerte für Temperatur, Luftfeuchtigkeit und Luftdruck können direkt verwendet werden.`,
senseBox_bme680_helpurl: "https://docs.sensebox.de/hardware/sensoren-umweltsensor/", senseBox_bme680_helpurl:
"https://docs.sensebox.de/hardware/sensoren-umweltsensor/",
/**
* Truebner SMT50
*/
senseBox_smt50: "Bodenfeuchte/-temperatur (SMT50)",
senseBox_smt50_helpurl:
"https://docs.sensebox.de/hardware/sensoren-truebner/",
senseBox_smt50_tooltip:
"Schließe den Bodenfeuchtigkeit- und Temperatursensor an einen der 3 digital/analog Ports an und wähle den Port im Block aus. Der Sensor gibt die Bodentemperatur in °C und die Bodenfeuchtigkeit in % aus.",
/** /**
* Truebner SMT50 * SCD30 CO2 Sensor
*/ */
senseBox_smt50: "Bodenfeuchte/-temperatur (SMT50)", senseBox_scd30: "CO2 Sensor (Sensirion SCD30)",
senseBox_smt50_helpurl: "https://docs.sensebox.de/hardware/sensoren-truebner/", senseBox_scd_tooltip:
senseBox_smt50_tooltip: "Schließe den Bodenfeuchtigkeit- und Temperatursensor an einen der 3 digital/analog Ports an und wähle den Port im Block aus. Der Sensor gibt die Bodentemperatur in °C und die Bodenfeuchtigkeit in % aus.", "Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für die CO2-Konzentration in ppm. Der Temperaturmesswert kann aufgrund der Messung direkt am Sensor um einige Grad vom realen Wert abweichen.",
senseBox_scd_co2: "CO2 in ppm",
senseBox_scd_helpurl: "https://docs.sensebox.de/hardware/sensoren-co2/",
/** /**
* SCD30 CO2 Sensor * Feinstaubsensor (SDS011)
*/ */
senseBox_scd30: "CO2 Sensor (Sensirion SCD30)",
senseBox_scd_tooltip: "Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für die CO2-Konzentration in ppm. Der Temperaturmesswert kann aufgrund der Messung direkt am Sensor um einige Grad vom realen Wert abweichen.",
senseBox_scd_co2: "CO2 in ppm",
senseBox_scd_helpurl: "https://docs.sensebox.de/hardware/sensoren-co2/",
/** senseBox_sds011: "Feinstaubsensor SDS011",
* Feinstaubsensor (SDS011) senseBox_sds011_dimension: "in µg/m³ an",
*/ senseBox_sds011_pm25: "PM2.5",
senseBox_sds011_pm10: "PM10",
senseBox_sds011_tooltip:
"Dieser Block gibt dir den Messwert des Feinstaubsensor. Schließe den Feinstaubsensor an einen der 2 **Serial/UART** Anschlüssen an. Im Dropdown Menü zwischen PM2.5 und PM10 auswählen. Der Messwert wird dir als **Kommazahl** in µg/m3",
senseBox_sds011_serial1: "Serial1",
senseBox_sds011_serial2: "Serial2",
senseBox_sds011_helpurl:
"https://docs.sensebox.de/hardware/sensoren-feinstaub/",
senseBox_sds011: "Feinstaubsensor", /**
senseBox_sds011_dimension: "in µg/m³ an", * Button
senseBox_sds011_pm25: "PM2.5", */
senseBox_sds011_pm10: "PM10", senseBox_button: "Button",
senseBox_sds011_tooltip: "Dieser Block gibt dir den Messwert des Feinstaubsensor. Schließe den Feinstaubsensor an einen der 2 **Serial/UART** Anschlüssen an. Im Dropdown Menü zwischen PM2.5 und PM10 auswählen. Der Messwert wird dir als **Kommazahl** in µg/m3", senseBox_button_isPressed: "ist gedrückt",
senseBox_sds011_serial1: "Serial1", senseBox_button_switch: "als Schalter",
senseBox_sds011_serial2: "Serial2", senseBox_button_wasPressed: "wurde gedrückt",
senseBox_sds011_helpurl: "https://docs.sensebox.de/hardware/sensoren-feinstaub/", senseBox_button_longPress: "Gedrückt für",
senseBox_button_tooltip: `Dieser Block gibt dir den Status des angeschlossenen Buttons. Im Dropdown Menü können verschiedene Modi für den Button ausgewählt werden. Angesteuert können entweder der on Board Button oder ein Button, der an einen der 6 digitalen Pins angeschlossen ist. verschiedene Modi:
/**
* Button
*/
senseBox_button: "Button",
senseBox_button_isPressed: "ist gedrückt",
senseBox_button_switch: "als Schalter",
senseBox_button_wasPressed: "wurde gedrückt",
senseBox_button_tooltip: `Dieser Block gibt dir den Status des angeschlossenen Buttons. Im Dropdown Menü können verschiedene Modi für den Button ausgewählt werden. Angesteuert können entweder der on Board Button oder ein Button, der an einen der 6 digitalen Pins angeschlossen ist. verschiedene Modi:
- "ist gedrückt": Mit diesem Modus kannst du abfragen ob der Block gerade gedrückt wird. Du erhältst entweder den Wert TRUE oder FALSE. - "ist gedrückt": Mit diesem Modus kannst du abfragen ob der Block gerade gedrückt wird. Du erhältst entweder den Wert TRUE oder FALSE.
- "wurde gedrückt": Mit diesem Modus kannst du abfragen ob der Block gedrückt wurde. Erst wenn der Knopf gedrückt und wieder losgelassen wurde erhältst du TRUE zurück - "wurde gedrückt": Mit diesem Modus kannst du abfragen ob der Block gedrückt wurde. Erst wenn der Knopf gedrückt und wieder losgelassen wurde erhältst du TRUE zurück
- "als Schalter": Wenn du diesen Block verwendest kannst du den Knopf wie ein Lichtschalter verwenden. Der Status wird gespeichert bis der Button erneut gedrückt wird`, - "als Schalter": Wenn du diesen Block verwendest kannst du den Knopf wie ein Lichtschalter verwenden. Der Status wird gespeichert bis der Button erneut gedrückt wird`,
senseBox_button_helpurl: "", senseBox_button_helpurl: "",
}
/**
* Feinstaubsensor Sensirion SPS30
*/
senseBox_sps30: "Feinstaubsensor Sensirion SPS30",
senseBox_sps30_dimension: "in µg/m³",
senseBox_sps30_1p0: "PM1.0",
senseBox_sps30_2p5: "PM2.5",
senseBox_sps30_4p0: "PM4.0",
senseBox_sps30_10p0: "PM10",
senseBox_sps30_tooltip:"Dieser Block gibt dir den Messwert des Sensirion SPS30 Feinstaubsensor. Schließe den Feinstaubsensor an einen der 5 **I2C** Anschlüssen an. Im Dropdown Menü zwischen PM1.0, PM2.5, PM4.0 und PM10 auswählen. Der Messwert wird dir als **Kommazahl** in µg/m3",
senseBox_sps30_helpurl:
"https://docs.sensebox.de/hardware/sensoren-feinstaub/",
};

View File

@ -1,11 +1,29 @@
export const WEB = { export const WEB = {
/** /**
* WiFi * WiFi
*/ */
senseBox_wifi_connect: "Verbinde mit WLAN", senseBox_wifi_connect: "Verbinde mit WLAN",
senseBox_wifi_ssid: "Netzwerkname", senseBox_wifi_ssid: "Netzwerkname",
senseBox_wifi_tooltip: "Stellt eine Verbindung mit einem WLAN-Netzwerk her. Möchtest du dich mit einem ungesicheren Netzwerk (z.B. Freifunk) verbinden lösche das Feld Passwort. Das WiFi-Bee muss auf den Steckplatz **XBEE1** aufgesteckt werden.", senseBox_wifi_ip: "IP-Address",
senseBox_wifi_startap: "Initialisiere WLAN Access Point", senseBox_wifi_ip_tooltip: "Gibt die IP-Address der senseBox aus",
senseBox_wifi_startap_tooltip: "Erstellt einen WiFi-Accesspoint zu dem du dich verbinden kannst. Beachte, dass immer nur 1 Gerät gleichzeitig verbunden werden kann.", senseBox_wifi_status: "WiFi-Status",
senseBox_wifi_helpurl: "https://docs.sensebox.de/blockly/blockly-web-wifi/", senseBox_wifi_status_tooltip: "Gibt den Status der WiFi-Verbindung aus",
} senseBox_wifi_rssi: "RSSI",
senseBox_wifi_rssi_tooltip: "Gibt die Sigal Stärke der WiFi-Verbindung",
senseBox_wifi_tooltip:
"Stellt eine Verbindung mit einem WLAN-Netzwerk her. Möchtest du dich mit einem ungesicheren Netzwerk (z.B. Freifunk) verbinden lösche das Feld Passwort. Das WiFi-Bee muss auf den Steckplatz **XBEE1** aufgesteckt werden.",
senseBox_wifi_startap: "Initialisiere WLAN Access Point",
senseBox_wifi_startap_tooltip:
"Erstellt einen WiFi-Accesspoint zu dem du dich verbinden kannst. Beachte, dass immer nur 1 Gerät gleichzeitig verbunden werden kann.",
senseBox_wifi_helpurl: "https://docs.sensebox.de/blockly/blockly-web-wifi/",
senseBox_ethernet: "Verbinde mit Ethernet",
senseBox_ethernet_dhcp: "DHCP",
senseBox_ethernet_manuel_config: "Manuelle Konfiguration",
senseBox_ethernet_ip: "IP-Adresse",
senseBox_ethernet_gateway: "Gateway",
senseBox_ethernet_subnetmask: "Subnetzmaske",
senseBox_ethernet_mac: "MAC-Adresse",
senseBox_ethernet_dns: "DNS-Server",
senseBox_ethernet_tooltip:
"Verbinde das LAN-Bee mit dem Steckplatz XBEE1. Die meisten Netzwerke verwenden DHCP und vergeben automatisch eine IP-Adresse. Solltest du eine Manuelle Konfiguration durchführen wollen wählen im Dropdown Menü **Manuelle Konfiguration** aus und gebe die entsprechenden Daten ein.",
};

View File

@ -1,20 +1,22 @@
export const TIME = { export const TIME = {
/**
/** * Interval Block
* Interval Block */
*/ senseBox_interval_timer: "Intervall: ",
senseBox_interval_timer: "Messintervall", senseBox_interval: "ms",
senseBox_interval: "ms", senseBox_interval_timer_tip:
senseBox_interval_timer_tip: "Intervall", "Definiere ein Intervall, das alle x Millisekunden ausgeführt wird",
ARD_TIME_DELAY: "Warte", ARD_TIME_DELAY: "Warte",
ARD_TIME_DELAY_MICROS: "Mikrosekunden", ARD_TIME_DELAY_MICROS: "Mikrosekunden",
ARD_TIME_DELAY_MICRO_TIP: "Warte eine spezifischen Zeit in Microsekunden", ARD_TIME_DELAY_MICRO_TIP: "Warte eine spezifischen Zeit in Microsekunden",
ARD_TIME_DELAY_TIP: "Warte spezifische Zeit in Millisekunden", ARD_TIME_DELAY_TIP: "Warte spezifische Zeit in Millisekunden",
ARD_TIME_INF: "Warte für immer (Beende Programm)", ARD_TIME_INF: "Warte für immer (Beende Programm)",
ARD_TIME_INF_TIP: "Stoppt das Programm.", ARD_TIME_INF_TIP: "Stoppt das Programm.",
ARD_TIME_MICROS: "Bereits vergangen Zeit (Mikrosekunden)", ARD_TIME_MICROS: "Bereits vergangen Zeit (Mikrosekunden)",
ARD_TIME_MICROS_TIP: "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated ARD_TIME_MICROS_TIP:
ARD_TIME_MILLIS: "Bereits vergangen Zeit (Millisekunden)", "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated
ARD_TIME_MILLIS_TIP: "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated ARD_TIME_MILLIS: "Bereits vergangen Zeit (Millisekunden)",
ARD_TIME_MS: "Millisekunden", ARD_TIME_MILLIS_TIP:
} "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated
ARD_TIME_MS: "Millisekunden",
};

View File

@ -1,212 +1,265 @@
export const TRANSLATIONS = { export const TRANSLATIONS = {
AUTH: "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen.",
CHANGE_VALUE_TITLE: "Wert ändern:",
CHAT: "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!",
CLEAN_UP: "Blöcke aufräumen",
COLLAPSE_ALL: "Alle Blöcke zusammenfalten",
COLLAPSE_BLOCK: "Block zusammenfalten",
DELETE_ALL_BLOCKS: "Alle %1 Bausteine löschen?",
DELETE_BLOCK: "Block löschen",
DELETE_X_BLOCKS: "Block %1 löschen",
DISABLE_BLOCK: "Block deaktivieren",
DUPLICATE_BLOCK: "Kopieren",
ENABLE_BLOCK: "Block aktivieren",
EXPAND_ALL: "Alle Blöcke entfalten",
EXPAND_BLOCK: "Block entfalten",
EXTERNAL_INPUTS: "externe Eingänge",
HELP: "Hilfe",
INLINE_INPUTS: "interne Eingänge",
LISTS_CREATE_EMPTY_HELPURL:
"https://github.com/google/blockly/wiki/Lists#create-empty-list",
LISTS_CREATE_EMPTY_TITLE: "Erzeuge eine leere Liste",
LISTS_CREATE_EMPTY_TOOLTIP: "Erzeugt eine leere Liste ohne Inhalt.",
LISTS_CREATE_WITH_CONTAINER_TITLE_ADD: "Liste",
LISTS_CREATE_WITH_CONTAINER_TOOLTIP:
"Hinzufügen, entfernen und sortieren von Elementen.",
LISTS_CREATE_WITH_HELPURL:
"https://github.com/google/blockly/wiki/Lists#create-list-with",
LISTS_CREATE_WITH_INPUT_WITH: "Erzeuge Liste mit",
LISTS_CREATE_WITH_ITEM_TOOLTIP: "Ein Element zur Liste hinzufügen.",
LISTS_CREATE_WITH_TOOLTIP: "Erzeugt eine List mit konfigurierten Elementen.",
LISTS_GET_INDEX_FIRST: "erstes",
LISTS_GET_INDEX_FROM_END: "#tes von hinten",
LISTS_GET_INDEX_FROM_START: "#tes",
LISTS_GET_INDEX_GET: "nimm",
LISTS_GET_INDEX_GET_REMOVE: "nimm und entferne",
LISTS_GET_INDEX_LAST: "letztes",
LISTS_GET_INDEX_RANDOM: "zufälliges",
LISTS_GET_INDEX_REMOVE: "entferne",
LISTS_GET_INDEX_TAIL: "",
LISTS_GET_INDEX_TOOLTIP_GET_FIRST:
"Extrahiere das erste Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_FROM_END:
"Extrahiere das #1te Element aus Ende der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_FROM_START:
"Extrahiere das #1te Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_LAST:
"Extrahiere das letzte Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_RANDOM:
"Extrahiere ein zufälliges Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST:
"Extrahiere und entfernt das erste Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END:
"Extrahiere und entfernt das #1te Element aus Ende der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START:
"Extrahiere und entfernt das #1te Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST:
"Extrahiere und entfernt das letzte Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM:
"Extrahiere und entfernt ein zufälliges Element aus der Liste.",
LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST:
"Entfernt das erste Element von der Liste.",
LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END:
"Entfernt das #1te Element von Ende der Liste.",
LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START:
"Entfernt das #1te Element von der Liste.",
LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST:
"Entfernt das letzte Element von der Liste.",
LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM:
"Entfernt ein zufälliges Element von der Liste.",
LISTS_GET_SUBLIST_END_FROM_END: "bis zu # von hinten",
LISTS_GET_SUBLIST_END_FROM_START: "bis zu #",
LISTS_GET_SUBLIST_END_LAST: "bis zum Ende",
LISTS_GET_SUBLIST_HELPURL:
"http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_GET_SUBLIST_START_FIRST: "erhalte Unterliste vom Anfang",
LISTS_GET_SUBLIST_START_FROM_END: "erhalte Unterliste von # von hinten",
LISTS_GET_SUBLIST_START_FROM_START: "erhalte Unterliste von #",
LISTS_GET_SUBLIST_TAIL: "",
LISTS_GET_SUBLIST_TOOLTIP:
"Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.",
LISTS_INDEX_OF_FIRST: "suche erstes Auftreten von",
LISTS_INDEX_OF_HELPURL:
"http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_INDEX_OF_LAST: "suche letztes Auftreten von",
LISTS_INDEX_OF_TOOLTIP:
"Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.",
LISTS_INLIST: "von der Liste",
LISTS_ISEMPTY_HELPURL:
"https://github.com/google/blockly/wiki/Lists#is-empty", // untranslated
LISTS_ISEMPTY_TITLE: "%1 ist leer?",
LISTS_ISEMPTY_TOOLTIP: "Ist wahr (true), wenn die Liste leer ist.",
LISTS_LENGTH_HELPURL:
"https://github.com/google/blockly/wiki/Lists#length-of", // untranslated
LISTS_LENGTH_TITLE: "Länge von %1",
LISTS_LENGTH_TOOLTIP: "Die Anzahl von Elementen in der Liste.",
LISTS_REPEAT_HELPURL:
"http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_REPEAT_TITLE: "Erzeuge Liste mit Element %1 wiederhole es %2 mal",
LISTS_REPEAT_TOOLTIP:
"Erzeugt eine Liste mit einer variablen Anzahl von Elementen",
LISTS_SET_INDEX_HELPURL:
"http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_SET_INDEX_INPUT_TO: "ein",
LISTS_SET_INDEX_INSERT: "füge",
LISTS_SET_INDEX_SET: "setze",
LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST:
"Fügt das Element an den Anfang der Liste an.",
LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END:
"Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element.",
LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START:
"Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element.",
LISTS_SET_INDEX_TOOLTIP_INSERT_LAST:
"Fügt das Element ans Ende der Liste an.",
LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM:
"Fügt das Element zufällig in die Liste ein.",
LISTS_SET_INDEX_TOOLTIP_SET_FIRST: "Setzt das erste Element in der Liste.",
LISTS_SET_INDEX_TOOLTIP_SET_FROM_END:
"Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element.",
LISTS_SET_INDEX_TOOLTIP_SET_FROM_START:
"Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element.",
LISTS_SET_INDEX_TOOLTIP_SET_LAST: "Setzt das letzte Element in der Liste.",
LISTS_SET_INDEX_TOOLTIP_SET_RANDOM:
"Setzt ein zufälliges Element in der Liste.",
LISTS_SORT_HELPURL:
"https://github.com/google/blockly/wiki/Lists#sorting-a-list",
LISTS_SORT_ORDER_ASCENDING: "aufsteigend",
LISTS_SORT_ORDER_DESCENDING: "absteigend",
LISTS_SORT_TITLE: "%1 %2 %3 sortieren",
LISTS_SORT_TOOLTIP: "Eine Kopie einer Liste sortieren.",
LISTS_SORT_TYPE_IGNORECASE: "alphabetisch, Schreibung ignorieren",
LISTS_SORT_TYPE_NUMERIC: "numerisch",
LISTS_SORT_TYPE_TEXT: "alphabetisch",
LISTS_SPLIT_HELPURL:
"https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists",
LISTS_SPLIT_LIST_FROM_TEXT: "Liste aus Text erstellen",
LISTS_SPLIT_TEXT_FROM_LIST: "Text aus Liste erstellen",
LISTS_SPLIT_TOOLTIP_JOIN:
"Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.",
LISTS_SPLIT_TOOLTIP_SPLIT:
"Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.",
LISTS_SPLIT_WITH_DELIMITER: "mit Trennzeichen",
LOGIC_BOOLEAN_FALSE: "falsch",
AUTH: "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen.", ME: "Ich",
CHANGE_VALUE_TITLE: "Wert ändern:", NEW_VARIABLE: "Neue Variable...",
CHAT: "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!", NEW_VARIABLE_TITLE: "Name der neuen Variable:",
CLEAN_UP: "Blöcke aufräumen", ORDINAL_NUMBER_SUFFIX: "",
COLLAPSE_ALL: "Alle Blöcke zusammenfalten", PROCEDURES_ALLOW_STATEMENTS: "Aussagen erlauben",
COLLAPSE_BLOCK: "Block zusammenfalten", PROCEDURES_CALLNORETURN_HELPURL:
DELETE_ALL_BLOCKS: "Alle %1 Bausteine löschen?", "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29",
DELETE_BLOCK: "Block löschen", PROCEDURES_CALLNORETURN_TOOLTIP:
DELETE_X_BLOCKS: "Block %1 löschen", "Rufe einen Funktionsblock ohne Rückgabewert auf.",
DISABLE_BLOCK: "Block deaktivieren", PROCEDURES_CALLRETURN_HELPURL:
DUPLICATE_BLOCK: "Kopieren", "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29",
ENABLE_BLOCK: "Block aktivieren", PROCEDURES_CALLRETURN_TOOLTIP:
EXPAND_ALL: "Alle Blöcke entfalten", "Rufe einen Funktionsblock mit Rückgabewert auf.",
EXPAND_BLOCK: "Block entfalten", PROCEDURES_CALL: "Rufe",
EXTERNAL_INPUTS: "externe Eingänge", PROCEDURES_CALL_END: "auf",
HELP: "Hilfe", PROCEDURES_DEFNORETURN: "Erstelle Funktion",
INLINE_INPUTS: "interne Eingänge", PROCEDURES_BEFORE_PARAMS: "mit Eingabeparameter:",
LISTS_CREATE_EMPTY_HELPURL: "https://github.com/google/blockly/wiki/Lists#create-empty-list", PROCEDURES_DEFRETURN_RETURN_TYPE: "Rückgabetype",
LISTS_CREATE_EMPTY_TITLE: "Erzeuge eine leere Liste", PROCEDURES_CALL_BEFORE_PARAMS: "mit:",
LISTS_CREATE_EMPTY_TOOLTIP: "Erzeugt eine leere Liste ohne Inhalt.", PROCEDURES_CREATE_DO: 'Erzeuge "Aufruf %1"',
LISTS_CREATE_WITH_CONTAINER_TITLE_ADD: "Liste", PROCEDURES_DEFNORETURN_COMMENT: "Beschreibe diese Funktion …",
LISTS_CREATE_WITH_CONTAINER_TOOLTIP: "Hinzufügen, entfernen und sortieren von Elementen.", PROCEDURES_DEFNORETURN_DO: "",
LISTS_CREATE_WITH_HELPURL: "https://github.com/google/blockly/wiki/Lists#create-list-with", PROCEDURES_DEFNORETURN_HELPURL:
LISTS_CREATE_WITH_INPUT_WITH: "Erzeuge Liste mit", "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29",
LISTS_CREATE_WITH_ITEM_TOOLTIP: "Ein Element zur Liste hinzufügen.", PROCEDURES_DEFNORETURN_PROCEDURE: "Funktionsblock",
LISTS_CREATE_WITH_TOOLTIP: "Erzeugt eine List mit konfigurierten Elementen.", PROCEDURES_DEFNORETURN_TITLE: "zu",
LISTS_GET_INDEX_FIRST: "erstes", PROCEDURES_DEFNORETURN_TOOLTIP: "Ein Funktionsblock ohne Rückgabewert.",
LISTS_GET_INDEX_FROM_END: "#tes von hinten", PROCEDURES_DEFRETURN_HELPURL:
LISTS_GET_INDEX_FROM_START: "#tes", "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29",
LISTS_GET_INDEX_GET: "nimm", PROCEDURES_DEFRETURN_RETURN: "gebe zurück",
LISTS_GET_INDEX_GET_REMOVE: "nimm und entferne", PROCEDURES_DEFRETURN_TOOLTIP: "Ein Funktionsblock mit Rückgabewert.",
LISTS_GET_INDEX_LAST: "letztes", PROCEDURES_DEF_DUPLICATE_WARNING:
LISTS_GET_INDEX_RANDOM: "zufälliges", "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter.",
LISTS_GET_INDEX_REMOVE: "entferne", PROCEDURES_HIGHLIGHT_DEF: "Markiere Funktionsblock",
LISTS_GET_INDEX_TAIL: "", PROCEDURES_IFRETURN_HELPURL: "http://c2.com/cgi/wiki?GuardClause",
LISTS_GET_INDEX_TOOLTIP_GET_FIRST: "Extrahiere das erste Element aus der Liste.", PROCEDURES_IFRETURN_TOOLTIP:
LISTS_GET_INDEX_TOOLTIP_GET_FROM_END: "Extrahiere das #1te Element aus Ende der Liste.", "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück.",
LISTS_GET_INDEX_TOOLTIP_GET_FROM_START: "Extrahiere das #1te Element aus der Liste.", PROCEDURES_IFRETURN_WARNING:
LISTS_GET_INDEX_TOOLTIP_GET_LAST: "Extrahiere das letzte Element aus der Liste.", "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden.",
LISTS_GET_INDEX_TOOLTIP_GET_RANDOM: "Extrahiere ein zufälliges Element aus der Liste.", PROCEDURES_MUTATORARG_TITLE: "Variable:",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST: "Extrahiere und entfernt das erste Element aus der Liste.", PROCEDURES_MUTATORARG_TOOLTIP: "Eine Eingabe zur Funktion hinzufügen.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END: "Extrahiere und entfernt das #1te Element aus Ende der Liste.", PROCEDURES_MUTATORCONTAINER_TITLE: "Parameter",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START: "Extrahiere und entfernt das #1te Element aus der Liste.", PROCEDURES_MUTATORCONTAINER_TOOLTIP:
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST: "Extrahiere und entfernt das letzte Element aus der Liste.", "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.",
LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM: "Extrahiere und entfernt ein zufälliges Element aus der Liste.", REDO: "Wiederholen",
LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST: "Entfernt das erste Element von der Liste.", REMOVE_COMMENT: "Kommentar entfernen",
LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END: "Entfernt das #1te Element von Ende der Liste.", RENAME_VARIABLE: "Variable umbenennen...",
LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START: "Entfernt das #1te Element von der Liste.", RENAME_VARIABLE_TITLE: 'Alle "%1" Variablen umbenennen in:',
LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST: "Entfernt das letzte Element von der Liste.",
LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM: "Entfernt ein zufälliges Element von der Liste.",
LISTS_GET_SUBLIST_END_FROM_END: "bis zu # von hinten",
LISTS_GET_SUBLIST_END_FROM_START: "bis zu #",
LISTS_GET_SUBLIST_END_LAST: "bis zum Ende",
LISTS_GET_SUBLIST_HELPURL: "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_GET_SUBLIST_START_FIRST: "erhalte Unterliste vom Anfang",
LISTS_GET_SUBLIST_START_FROM_END: "erhalte Unterliste von # von hinten",
LISTS_GET_SUBLIST_START_FROM_START: "erhalte Unterliste von #",
LISTS_GET_SUBLIST_TAIL: "",
LISTS_GET_SUBLIST_TOOLTIP: "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.",
LISTS_INDEX_OF_FIRST: "suche erstes Auftreten von",
LISTS_INDEX_OF_HELPURL: "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_INDEX_OF_LAST: "suche letztes Auftreten von",
LISTS_INDEX_OF_TOOLTIP: "Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.",
LISTS_INLIST: "von der Liste",
LISTS_ISEMPTY_HELPURL: "https://github.com/google/blockly/wiki/Lists#is-empty", // untranslated
LISTS_ISEMPTY_TITLE: "%1 ist leer?",
LISTS_ISEMPTY_TOOLTIP: "Ist wahr (true), wenn die Liste leer ist.",
LISTS_LENGTH_HELPURL: "https://github.com/google/blockly/wiki/Lists#length-of", // untranslated
LISTS_LENGTH_TITLE: "Länge von %1",
LISTS_LENGTH_TOOLTIP: "Die Anzahl von Elementen in der Liste.",
LISTS_REPEAT_HELPURL: "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_REPEAT_TITLE: "Erzeuge Liste mit Element %1 wiederhole es %2 mal",
LISTS_REPEAT_TOOLTIP: "Erzeugt eine Liste mit einer variablen Anzahl von Elementen",
LISTS_SET_INDEX_HELPURL: "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic:%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm",
LISTS_SET_INDEX_INPUT_TO: "ein",
LISTS_SET_INDEX_INSERT: "füge",
LISTS_SET_INDEX_SET: "setze",
LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST: "Fügt das Element an den Anfang der Liste an.",
LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END: "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element.",
LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START: "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element.",
LISTS_SET_INDEX_TOOLTIP_INSERT_LAST: "Fügt das Element ans Ende der Liste an.",
LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM: "Fügt das Element zufällig in die Liste ein.",
LISTS_SET_INDEX_TOOLTIP_SET_FIRST: "Setzt das erste Element in der Liste.",
LISTS_SET_INDEX_TOOLTIP_SET_FROM_END: "Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element.",
LISTS_SET_INDEX_TOOLTIP_SET_FROM_START: "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element.",
LISTS_SET_INDEX_TOOLTIP_SET_LAST: "Setzt das letzte Element in der Liste.",
LISTS_SET_INDEX_TOOLTIP_SET_RANDOM: "Setzt ein zufälliges Element in der Liste.",
LISTS_SORT_HELPURL: "https://github.com/google/blockly/wiki/Lists#sorting-a-list",
LISTS_SORT_ORDER_ASCENDING: "aufsteigend",
LISTS_SORT_ORDER_DESCENDING: "absteigend",
LISTS_SORT_TITLE: "%1 %2 %3 sortieren",
LISTS_SORT_TOOLTIP: "Eine Kopie einer Liste sortieren.",
LISTS_SORT_TYPE_IGNORECASE: "alphabetisch, Schreibung ignorieren",
LISTS_SORT_TYPE_NUMERIC: "numerisch",
LISTS_SORT_TYPE_TEXT: "alphabetisch",
LISTS_SPLIT_HELPURL: "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists",
LISTS_SPLIT_LIST_FROM_TEXT: "Liste aus Text erstellen",
LISTS_SPLIT_TEXT_FROM_LIST: "Text aus Liste erstellen",
LISTS_SPLIT_TOOLTIP_JOIN: "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.",
LISTS_SPLIT_TOOLTIP_SPLIT: "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.",
LISTS_SPLIT_WITH_DELIMITER: "mit Trennzeichen",
LOGIC_BOOLEAN_FALSE: "falsch",
ME: "Ich", TODAY: "Heute",
NEW_VARIABLE: "Neue Variable...", UNDO: "Rückgängig",
NEW_VARIABLE_TITLE: "Name der neuen Variable:", VARIABLES_DEFAULT_NAME: "Element",
ORDINAL_NUMBER_SUFFIX: "", VARIABLES_GET_CREATE_SET: 'Erzeuge "Schreibe %1"',
PROCEDURES_ALLOW_STATEMENTS: "Aussagen erlauben", VARIABLES_GET_HELPURL:
PROCEDURES_CALLNORETURN_HELPURL: "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29",
PROCEDURES_CALLNORETURN_TOOLTIP: "Rufe einen Funktionsblock ohne Rückgabewert auf.", VARIABLES_GET_TOOLTIP: "Gibt den Wert der Variable zurück.",
PROCEDURES_CALLRETURN_HELPURL: "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", VARIABLES_SET: "Schreibe %1 %2",
PROCEDURES_CALLRETURN_TOOLTIP: "Rufe einen Funktionsblock mit Rückgabewert auf.", VARIABLES_SET_CREATE_GET: 'Erzeuge "Lese %1"',
PROCEDURES_CALL: "Rufe", VARIABLES_SET_HELPURL:
PROCEDURES_CALL_END: "auf", "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29",
PROCEDURES_DEFNORETURN: "Erstelle Funktion", VARIABLES_SET_TOOLTIP: "Setzt den Wert einer Variable.",
PROCEDURES_BEFORE_PARAMS: "mit Eingabeparameter:", MATH_CHANGE_TITLE_ITEM: "Element",
PROCEDURES_DEFRETURN_RETURN_TYPE: "Rückgabetype", PROCEDURES_DEFRETURN_TITLE: "zu",
PROCEDURES_CALL_BEFORE_PARAMS: "mit:", CONTROLS_IF_IF_TITLE_IF: "if",
PROCEDURES_CREATE_DO: "Erzeuge \"Aufruf %1\"", CONTROLS_WHILEUNTIL_INPUT_DO: "mache",
PROCEDURES_DEFNORETURN_COMMENT: "Beschreibe diese Funktion …", CONTROLS_IF_MSG_THEN: "mache",
PROCEDURES_DEFNORETURN_DO: "", CONTROLS_IF_ELSE_TITLE_ELSE: "sonst",
PROCEDURES_DEFNORETURN_HELPURL: "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", PROCEDURES_DEFRETURN_PROCEDURE: "Funktionsblock",
PROCEDURES_DEFNORETURN_PROCEDURE: "Funktionsblock", LISTS_GET_SUBLIST_INPUT_IN_LIST: "in der Liste",
PROCEDURES_DEFNORETURN_TITLE: "zu", LISTS_GET_INDEX_INPUT_IN_LIST: "in der Liste",
PROCEDURES_DEFNORETURN_TOOLTIP: "Ein Funktionsblock ohne Rückgabewert.", PROCEDURES_DEFRETURN_DO: "",
PROCEDURES_DEFRETURN_HELPURL: "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", CONTROLS_IF_ELSEIF_TITLE_ELSEIF: "sonst wenn",
PROCEDURES_DEFRETURN_RETURN: "gebe zurück", LISTS_GET_INDEX_HELPURL:
PROCEDURES_DEFRETURN_TOOLTIP: "Ein Funktionsblock mit Rückgabewert.", "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
PROCEDURES_DEF_DUPLICATE_WARNING: "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter.", CONTROLS_FOREACH_INPUT_DO: "mache",
PROCEDURES_HIGHLIGHT_DEF: "Markiere Funktionsblock", LISTS_SET_INDEX_INPUT_IN_LIST: "in der Liste",
PROCEDURES_IFRETURN_HELPURL: "http://c2.com/cgi/wiki?GuardClause", CONTROLS_FOR_INPUT_DO: "mache",
PROCEDURES_IFRETURN_TOOLTIP: "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück.", LISTS_CREATE_WITH_ITEM_TITLE: "item",
PROCEDURES_IFRETURN_WARNING: "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden.", TEXT_APPEND_VARIABLE: "item",
PROCEDURES_MUTATORARG_TITLE: "Variable:", TEXT_CREATE_JOIN_ITEM_TITLE_ITEM: "item",
PROCEDURES_MUTATORARG_TOOLTIP: "Eine Eingabe zur Funktion hinzufügen.", LISTS_INDEX_OF_INPUT_IN_LIST: "von der Liste",
PROCEDURES_MUTATORCONTAINER_TITLE: "Parameter", PROCEDURES_DEFRETURN_COMMENT: "Beschreibe diese Funktion …",
PROCEDURES_MUTATORCONTAINER_TOOLTIP: "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.",
REDO: "Wiederholen",
REMOVE_COMMENT: "Kommentar entfernen",
RENAME_VARIABLE: "Variable umbenennen...",
RENAME_VARIABLE_TITLE: "Alle \"%1\" Variablen umbenennen in:",
TODAY: "Heute", /*senseBox Blockly Translations*/
UNDO: "Rückgängig",
VARIABLES_DEFAULT_NAME: "Element",
VARIABLES_GET_CREATE_SET: "Erzeuge \"Schreibe %1\"",
VARIABLES_GET_HELPURL: "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29",
VARIABLES_GET_TOOLTIP: "Gibt den Wert der Variable zurück.",
VARIABLES_SET: "Schreibe %1 %2",
VARIABLES_SET_CREATE_GET: "Erzeuge \"Lese %1\"",
VARIABLES_SET_HELPURL: "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29",
VARIABLES_SET_TOOLTIP: "Setzt den Wert einer Variable.",
MATH_CHANGE_TITLE_ITEM: "Element",
PROCEDURES_DEFRETURN_TITLE: "zu",
CONTROLS_IF_IF_TITLE_IF: "if",
CONTROLS_WHILEUNTIL_INPUT_DO: "mache",
CONTROLS_IF_MSG_THEN: "mache",
CONTROLS_IF_ELSE_TITLE_ELSE: "sonst",
PROCEDURES_DEFRETURN_PROCEDURE: "Funktionsblock",
LISTS_GET_SUBLIST_INPUT_IN_LIST: "in der Liste",
LISTS_GET_INDEX_INPUT_IN_LIST: "in der Liste",
PROCEDURES_DEFRETURN_DO: "",
CONTROLS_IF_ELSEIF_TITLE_ELSEIF: "sonst wenn",
LISTS_GET_INDEX_HELPURL: "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list",
CONTROLS_FOREACH_INPUT_DO: "mache",
LISTS_SET_INDEX_INPUT_IN_LIST: "in der Liste",
CONTROLS_FOR_INPUT_DO: "mache",
LISTS_CREATE_WITH_ITEM_TITLE: "item",
TEXT_APPEND_VARIABLE: "item",
TEXT_CREATE_JOIN_ITEM_TITLE_ITEM: "item",
LISTS_INDEX_OF_INPUT_IN_LIST: "von der Liste",
PROCEDURES_DEFRETURN_COMMENT: "Beschreibe diese Funktion …",
/*senseBox Blockly Translations*/ senseBox_basic_blue: "Blau",
senseBox_basic_green: "Grün",
senseBox_basic_blue: "Blau", senseBox_basic_red: "Rot",
senseBox_basic_green: "Grün", senseBox_basic_state: "Status",
senseBox_basic_red: "Rot", senseBox_off: "Aus",
senseBox_basic_state: "Status", senseBox_on: "Ein",
senseBox_off: "Aus", senseBox_sensor: "Sensoren",
senseBox_on: "Ein", senseBox_output_filename: "Daten",
senseBox_sensor: "Sensoren", senseBox_output_format: "Format:",
senseBox_output_filename: "Daten", senseBox_output_linebreak: "Zeilenumbruch",
senseBox_output_format: "Format:", senseBox_output_networkid: "NetzwerkID",
senseBox_output_linebreak: "Zeilenumbruch", senseBox_output_password: "Passwort",
senseBox_output_networkid: "NetzwerkID", senseBox_output_safetosd: "Auf SD Karte speichern",
senseBox_output_password: "Passwort", senseBox_output_safetosd_tip: "Speichert Messwerte auf SD Karte",
senseBox_output_safetosd: "Auf SD Karte speichern", senseBox_output_serialprint: "Auf Kommandozeile ausgeben",
senseBox_output_safetosd_tip: "Speichert Messwerte auf SD Karte", senseBox_serial_tip:
senseBox_output_serialprint: "Auf Kommandozeile ausgeben", "Gibt Messwerte oder Daten auf dem Seriellen Monitor der Arduino IDE aus. Praktisch um ohne Display zu arbeiten",
senseBox_serial_tip: "Gibt Messwerte oder Daten auf dem Seriellen Monitor der Arduino IDE aus. Praktisch um ohne Display zu arbeiten", senseBox_output_timestamp: "Zeitstempel (RFC 3339)",
senseBox_output_timestamp: "Zeitstempel", senseBox_led: "LED an",
senseBox_led: "LED an digitalen", senseBox_led_tip:
senseBox_led_tip: "Einfache LED. Beim Anschluss sollte immer ein Vorwiderstand verwendet werden", "Einfache LED. Beim Anschluss sollte immer ein Vorwiderstand verwendet werden",
senseBox_piezo: "Piezo an digital", senseBox_piezo: "Piezo an digital",
senseBox_piezo_tip: "Piezo an digital PIN. Beim Anschluss sollte immer ein Vorwiderstand verwendet werden", senseBox_piezo_tip:
senseBox_foto: "Fotowiderstand", "Piezo an digital PIN. Beim Anschluss sollte immer ein Vorwiderstand verwendet werden",
senseBox_foto_tip: "Fotowiderstand", senseBox_foto: "Fotowiderstand",
senseBox_hum: "Luftfeuchtigkeit in %", senseBox_foto_tip: "Fotowiderstand",
senseBox_hum_tip: "Luftfeuchtigkeit", senseBox_hum: "Luftfeuchtigkeit in %",
senseBox_ir: "Infrarot Abstandssensor", senseBox_hum_tip: "Luftfeuchtigkeit",
senseBox_ir_tip: "Infrarot Abstandssensor", senseBox_ir: "Infrarot Abstandssensor",
senseBox_lux: "Helligkeitssensor", senseBox_ir_tip: "Infrarot Abstandssensor",
senseBox_lux_tip: "Helligkeitssensor", senseBox_lux: "Helligkeitssensor",
senseBox_poti: "Potenziometer", senseBox_lux_tip: "Helligkeitssensor",
senseBox_poti_tip: "Potenziometer", senseBox_poti: "Potenziometer",
senseBox_soil: "Bodenfeuchte", senseBox_poti_tip: "Potenziometer",
senseBox_watertemperature: "Wassertemperatur", senseBox_soil: "Bodenfeuchte",
senseBox_watertemperature: "Wassertemperatur",
} };

View File

@ -8,18 +8,27 @@ export const UI = {
toolbox_math: "Mathematik", toolbox_math: "Mathematik",
toolbox_io: "Eingang/Ausgang", toolbox_io: "Eingang/Ausgang",
toolbox_time: "Zeit", toolbox_time: "Zeit",
toolbox_rtc: "RTC",
toolbox_ntp: "NTP",
toolbox_functions: "Funktionen", toolbox_functions: "Funktionen",
toolbox_variables: "Variablen", toolbox_variables: "Variablen",
toolbox_serial: "Seriell",
toolbox_advanced: "Erweitert",
toolbox_motors: "Motoren",
toolbox_label_externalRTC: "Externe RTC",
toolbox_label_internalRTC: "Interne RTC",
variable_NUMBER: "Zahl (int)", variable_NUMBER: "Zahl (int)",
variable_SHORT_NUMBER: "char", variable_SHORT_NUMBER: "char",
variable_LONG: "große Zahl (long)", variable_LONG: "große Zahl (long)",
variable_DECIMAL: "Kommazahl (float)", variable_DECIMAL: "Kommazahl (float)",
variables_TEXT: "Text (string)", variables_TEXT: "Text (string)",
variables_ARRAY: "Array (array)", variables_ARRAY: "Array (array)",
variables_CHARACTER: "char (char)", variables_CHARACTER: "Buchstabe (char)",
variables_BOOLEAN: "Boolean (boolean)", variables_BOOLEAN: "Boolean (boolean)",
variables_NULL: "void (void)", variables_NULL: "void (void)",
variables_UNDEF: "undefined", variables_UNDEF: "undefined",
variables_set: "Schreibe",
variables_to: "",
/** /**
* Tooltips * Tooltips
@ -49,7 +58,14 @@ export const UI = {
tooltip_project_title: "Titel des Projektes", tooltip_project_title: "Titel des Projektes",
tooltip_check_solution: "Lösung kontrollieren", tooltip_check_solution: "Lösung kontrollieren",
tooltip_copy_code: "Code in die Zwischenablage kopieren", tooltip_copy_code: "Code in die Zwischenablage kopieren",
tooltip_statistics_current: "Anzahl aktueller Blöcke",
tooltip_statistics_new: "Anzahl neuer Blöcke",
tooltip_statistics_changed: "Anzahl veränderter Blöcke",
tooltip_statistics_moved: "Anzahl bewegter Blöcke",
tooltip_statistics_deleted: "Anzahl gelöschter Blöcke",
tooltip_statistics_remaining: "Verbleibende Blöcke",
tooltip_statistics_show: "Statistiken anzeigen",
tooltip_start_tour: "Tour starten",
/** /**
* Messages * Messages
* *
@ -76,13 +92,23 @@ export const UI = {
messages_rename_success_01: "Das Projekt wurde erfolgreich in ", messages_rename_success_01: "Das Projekt wurde erfolgreich in ",
messages_rename_success_02: "umbenannt.", messages_rename_success_02: "umbenannt.",
messages_newblockly_head: messages_newblockly_head:
"Willkommen zur neuen Version Blockly für die senseBox", "Willkommen zur neuen senseBox Lern- und Programmierumgebung",
messages_newblockly_text: messages_newblockly_text:
"Die neue Blockly-Version befindet sich derzeit in der Testphase. Wenn Sie einen Fehler finden, melden Sie diesen bitte in unserem [Forum](https://forum.sensebox.de/t/neue-blockly-version-beta-test-und-feedback/1176). Eine Übersicht über alle neuen Funktionen finden Sie [hier](/news)", "Nach einer Testphase kann die neue senseBox Lern- und Programmierumgebung verwendet werden. Wenn Sie weiterhin Fehler finden, melden Sie diesen bitte in unserem [Forum](https://forum.sensebox.de/t/neue-blockly-version-beta-test-und-feedback/1176). Eine Übersicht über alle neuen Funktionen finden Sie [hier](/news)",
messages_GET_TUTORIAL_FAIL: "Zurück zur Tutorials-Übersicht", messages_GET_TUTORIAL_FAIL: "Zurück zur Tutorials-Übersicht",
messages_LOGIN_FAIL: "Der Benutzername oder das Passwort ist nicht korrekt.", messages_LOGIN_FAIL: "Der Benutzername oder das Passwort ist nicht korrekt.",
messages_copy_code: "Code wurde in die Zwischenablage kopiert", messages_copy_code: "Code wurde in die Zwischenablage kopiert",
/**
* Tablet Dialog
*/
tabletDialog_headline: "Tablet Modus ist aktiviert!",
tabletDialog_text:
"Der Tablet Modus wurde aktiviert. Du kannst nun Programmcodes über die senseBox Connect App auf deine senseBox kopieren. Der Tablet Modus kann in den Einstellungen deaktiviert werden",
tabletDialog_more:
"Weitere Informationen und den Link zum Download der App findest du unter: ",
/** /**
* Reset Dialog * Reset Dialog
*/ */
@ -122,6 +148,7 @@ export const UI = {
button_cancel: "Abbrechen", button_cancel: "Abbrechen",
button_close: "Schließen", button_close: "Schließen",
button_save: "Speichern",
button_accept: "Bestätigen", button_accept: "Bestätigen",
button_compile: "Kompilieren", button_compile: "Kompilieren",
button_create_variableCreate: "Erstelle Variable", button_create_variableCreate: "Erstelle Variable",
@ -129,6 +156,7 @@ export const UI = {
button_next: "nächster Schritt", button_next: "nächster Schritt",
button_tutorial_overview: "Tutorial Übersicht", button_tutorial_overview: "Tutorial Übersicht",
button_login: "Anmelden", button_login: "Anmelden",
button_createVariable: "Typisierte Variable erstellen",
/** /**
* *
@ -154,7 +182,16 @@ export const UI = {
"Die Anzeige von Statistiken zur Nutzung der Blöcke oberhalb der Arbeitsfläche kann ein- oder ausgeblendet werden.", "Die Anzeige von Statistiken zur Nutzung der Blöcke oberhalb der Arbeitsfläche kann ein- oder ausgeblendet werden.",
settings_statistics_on: "An", settings_statistics_on: "An",
settings_statistics_off: "Aus", settings_statistics_off: "Aus",
settings_ota_head: "Tablet Modus",
settings_ota_text:
"Der Tablet Modus deaktiviert die Code anzeige und aktiviert die Möglichkeit den Programmcode über die senseBox Connect App zu übertragen. Weitere Informationen dazu findest du unter: ",
settings_ota_on: "Aktiviert",
settings_ota_off: "Deaktiviert",
settings_sounds: "Töne",
settings_sounds_text:
"Aktiviere oder Deaktiviere Töne beim hinzufügen und löschen von Blöcken. Standardmäßig deaktiviert",
settings_board: "Board",
settings_board_text: "Wähle dein verwendetes Board aus",
/** /**
* 404 * 404
*/ */
@ -175,7 +212,7 @@ export const UI = {
/** /**
* Tutorials * Tutorials
*/ */
tutorials_home_head: "Tutorial-Übersicht",
tutorials_assessment_task: "Aufgabe", tutorials_assessment_task: "Aufgabe",
tutorials_hardware_head: "Für die Umsetzung benötigst du folgende Hardware:", tutorials_hardware_head: "Für die Umsetzung benötigst du folgende Hardware:",
tutorials_hardware_moreInformation: tutorials_hardware_moreInformation:
@ -187,7 +224,9 @@ export const UI = {
/** /**
* Tutorial Builder * Tutorial Builder
*/ */
builder_createNew: "neues Tutorial erstellen",
builder_changeExisting: "bestehendes Tutorial ändern",
builder_deleteExisting: "bestehendes Tutorial löschen",
builder_solution: "Lösung", builder_solution: "Lösung",
builder_solution_submit: "Lösung einreichen", builder_solution_submit: "Lösung einreichen",
builder_example_submit: "Beispiel einreichen", builder_example_submit: "Beispiel einreichen",
@ -199,6 +238,12 @@ export const UI = {
builder_requirements_head: "Voraussetzungen", builder_requirements_head: "Voraussetzungen",
builder_requirements_order: builder_requirements_order:
"Beachte, dass die Reihenfolge des Anhakens maßgebend ist.", "Beachte, dass die Reihenfolge des Anhakens maßgebend ist.",
builder_difficulty: "Schwierigkeitsgrad",
builder_public_head: "Tutorial veröffentlichen",
builder_public_label: "Tutorial für alle Nutzer:innen veröffentlichen",
builder_review_head: "Tutorial veröffentlichen",
builder_review_text:
"Du kannst dein Tutorial direkt über den Link mit anderen Personen teilen. Wenn du dein Tutorial für alle Nutzer:innen in der Überischt veröffenltichen wollen kannst du es hier aktivieren. Ein Administrator wird dein Tutorial ansehen und anschließend freischalten.",
/** /**
* Login * Login
@ -212,10 +257,10 @@ export const UI = {
/** /**
* Navbar * Navbar
*/ */
navbar_blockly: "Blockly",
navbar_tutorials: "Tutorials", navbar_tutorials: "Tutorials",
navbar_tutorialbuilder: "Tutorial erstellen", navbar_tutorialbuilder: "Tutorial erstellen",
navbar_gallery: "Gallerie", navbar_gallery: "Galerie",
navbar_projects: "Projekte", navbar_projects: "Projekte",
navbar_menu: "Menü", navbar_menu: "Menü",
@ -253,4 +298,36 @@ export const UI = {
drawer_ideerror_head: "Hoppla da ist was schief gegangen.", drawer_ideerror_head: "Hoppla da ist was schief gegangen.",
drawer_ideerror_text: drawer_ideerror_text:
"Beim kompilieren ist ein Fehler aufgetreten, überprüfe deine Blöcke.", "Beim kompilieren ist ein Fehler aufgetreten, überprüfe deine Blöcke.",
/**
* Code Editor
* */
codeeditor_libraries_head: "Installierte Arduino Libraries",
codeeditor_libraries_text:
"Für die Dokumentation sehen Sie sich die installierten Bibliotheken und deren Beispiele an",
codeeditor_save_code: "Code herunterladen",
codeeditor_open_code: "Code öffnen",
codeeditor_reset_code: "Code zurücksetzen",
codeeditor_blockly_code: "Lade Blockly Code",
codeeditor_compile_progress:
"Dein Code wird nun kompiliert und anschließend auf deinen Computer heruntergeladen",
/**
* Device Selction
* */
deviceselection_head: "Welches Board benutzt du?",
deviceselection_keep_selection:
"Speichere meine Auswahl fürs nächste Mal (Du kannst das Board später in den Einstellungen wechseln)",
deviceselection_footnote: "Hier kommst du zur alten Blockly Version für den ",
deviceselection_footnote_02: "oder die",
/**
* Sensor Markdown Information
*/
sensorinfo_info: "Informationen zum Sensor",
sensorinfo_description: "Beschreibung",
sensorinfo_measurable_phenos: "Messbare Phänomene",
sensorinfo_manufacturer: "Hersteller",
sensorinfo_lifetime: "Lebensdauer",
sensorinfo_explanation: "Diese Informationen wurden aus [sensors.wiki](https://sensors.wiki) entnommen. Für weitere Informationen besuchen Sie den Abschnitt über diesen Sensor "
}; };

View File

@ -726,7 +726,7 @@ Blockly.Msg.senseBox_output_safetosd_tip = "Speichert Messwerte auf SD Karte";
Blockly.Msg.senseBox_output_serialprint = "Auf Kommandozeile ausgeben"; Blockly.Msg.senseBox_output_serialprint = "Auf Kommandozeile ausgeben";
Blockly.Msg.senseBox_serial_tip = Blockly.Msg.senseBox_serial_tip =
"Gibt Messwerte oder Daten auf dem Seriellen Monitor der Arduino IDE aus. Praktisch um ohne Display zu arbeiten"; "Gibt Messwerte oder Daten auf dem Seriellen Monitor der Arduino IDE aus. Praktisch um ohne Display zu arbeiten";
Blockly.Msg.senseBox_output_timestamp = "Zeitstempel"; Blockly.Msg.senseBox_output_timestamp = "Zeitstempel (RFC 3339)";
Blockly.Msg.senseBox_led = "LED an digitalen"; Blockly.Msg.senseBox_led = "LED an digitalen";
Blockly.Msg.senseBox_led_tip = Blockly.Msg.senseBox_led_tip =
@ -745,8 +745,8 @@ Blockly.Msg.senseBox_lux_tip = "Helligkeitssensor";
Blockly.Msg.senseBox_poti = "Potenziometer"; Blockly.Msg.senseBox_poti = "Potenziometer";
Blockly.Msg.senseBox_poti_tip = "Potenziometer"; Blockly.Msg.senseBox_poti_tip = "Potenziometer";
Blockly.Msg.senseBox_pressure_sensor = "Luftdruck-/Temperatursensor (BMP280)"; Blockly.Msg.senseBox_pressure_sensor = "Luftdruck-/Temperatursensor (BMP280)";
Blockly.Msg.senseBox_pressure = "Luftdruck in Pa"; Blockly.Msg.senseBox_pressure = "Luftdruck in hPa";
Blockly.Msg.senseBox_pressure_dimension = "Luftdruck in Pa"; Blockly.Msg.senseBox_pressure_dimension = "Luftdruck in hPa";
Blockly.Msg.senseBox_pressure_tip = "Luftdrucksensor"; Blockly.Msg.senseBox_pressure_tip = "Luftdrucksensor";
Blockly.Msg.senseBox_pressure_referencePressure = "Luftdruck auf NN"; Blockly.Msg.senseBox_pressure_referencePressure = "Luftdruck auf NN";
Blockly.Msg.senseBox_pressure_referencePressure_dim = "hPa"; Blockly.Msg.senseBox_pressure_referencePressure_dim = "hPa";

View File

@ -8,10 +8,12 @@ import { MATH } from "./en/math";
import { MQTT } from "./en/mqtt"; import { MQTT } from "./en/mqtt";
import { SENSEBOX } from "./en/sensebox"; import { SENSEBOX } from "./en/sensebox";
import { DISPLAY } from "./en/sensebox-display"; import { DISPLAY } from "./en/sensebox-display";
import { MOTORS } from "./en/sensebox-motors";
import { LED } from "./en/sensebox-led"; import { LED } from "./en/sensebox-led";
import { LORA } from "./en/sensebox-lora"; import { LORA } from "./en/sensebox-lora";
import { OSEM } from "./en/sensebox-osem"; import { OSEM } from "./en/sensebox-osem";
import { RTC } from "./en/sensebox-rtc"; import { RTC } from "./en/sensebox-rtc";
import { NTP } from "./en/sensebox-ntp";
import { SD } from "./en/sensebox-sd"; import { SD } from "./en/sensebox-sd";
import { SENSORS } from "./en/sensebox-sensors"; import { SENSORS } from "./en/sensebox-sensors";
import { TELEGRAM } from "./en/sensebox-telegram"; import { TELEGRAM } from "./en/sensebox-telegram";
@ -34,10 +36,12 @@ export const En = {
...MATH, ...MATH,
...MQTT, ...MQTT,
...DISPLAY, ...DISPLAY,
...MOTORS,
...LED, ...LED,
...LORA, ...LORA,
...OSEM, ...OSEM,
...RTC, ...RTC,
...NTP,
...SD, ...SD,
...SENSORS, ...SENSORS,
...SENSEBOX, ...SENSEBOX,

Some files were not shown because too many files have changed in this diff Show More