Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e95d57139 |
@@ -1,6 +1,2 @@
|
|||||||
REACT_APP_COMPILER_URL=https://compiler.sensebox.de
|
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
|
|
||||||
|
|
||||||
# in days
|
|
||||||
REACT_APP_SHARE_LINK_EXPIRES=30
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
# 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
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
# Blockly 2020
|
|
||||||
|
|
||||||
(aktuelles Preview unter: https://deploy-preview-37--blockly-react.netlify.app/)
|
|
||||||
|
|
||||||
In den letzten Wochen haben wir eine komplett neue Lern- und Programmierumgebung für die senseBox geschaffen. Die Basis bildet hierbei weiterhin Google Blockly und das Frontend wird über React realisiert. Fast alle Blöcke wurden bereits aus der alten Version in die neue Version migriert.
|
|
||||||
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Blockly Core
|
|
||||||
Nachdem die bisherige Version, die unter [blockly.sensebox.de](https://blockly.sensebox.de) verfügbar ist, auf einen Google Blockly Core von 2016 aufbaut, wurde es Zeit ein großes Update durchzuführen. Durch den neuen Blockly Core lassen sich auch andere Renderer der Blöcke verwenden. In den Einstellungen kannst du zwischen den zwei Renderern Geras und Zelos auswählen. Geras ist der klassische Blockly Renderer während Zelos vor allem für Touchoberfläche optimiert worden ist.
|
|
||||||
|
|
||||||
### Typed Variablen
|
|
||||||
|
|
||||||
Neue Variablen werden nun direkt mit einem bestimmten Datentyp angelegt. Ein einfacher Check überprüft ob der zurückgegeben Typ eines Blockes mit dem der Variablen kompatibel ist.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### Funktionen (funktioniert aktuell nicht!)
|
|
||||||
|
|
||||||
Funktionen mit Rückgabe Wert und Eingabeparametern können angelegt werden. Durch die Verwendung von Funktionen lassen sich auch komplexere Programme übersichtlicher darstellen und bearbeiten. Beim Anlegen einer Funktion kann über das Zahnrad weitere Eingabeparameter hinzuefügt werden.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### GPS
|
|
||||||
|
|
||||||
Der Code für das GPS Modul wurde neu aufgebaut und ermöglicht es deutlich schneller einen GPS Fix zu bekommen. Zusätzlich lassen sich bald! die Koordinaten in zwei verschiedenen Formaten zurückgebenlassen. Zum einen als Kommazahl zum anderen als Zahl ohne nachkommastellen
|
|
||||||
|
|
||||||
### MQTT
|
|
||||||
Zwei einfache Blöcke ermöglichen es nun die Daten über MQTT an einen Broker zu versenden. Zwei Broker sind bereits "vorprogrammiert" (Adafruit IO und DIOTY). Natürlich können auch eigene Broker verwendet werden. Falls ihr gute freie Broker kennt, die wir hinzufügen sollten meldet euch einfach bei uns.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### TTN Mapper
|
|
||||||
Bisher war es möglich einen "kleinen" TTN Mapper zu bauen, der die Daten als Cayenne Payload versendet hat. Es gibt nun einen Block der es direkt ermöglicht einen vollständigen TTN Mapper zu Programmieren, der die Daten auch auf [TTNMapper](https://ttnmapper.org/) veröffentlichen kann.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
## Fronted
|
|
||||||
|
|
||||||
In der Oberfläche gibt es einige Neuigkeiten. Ziel ist es Blockly für die senseBox zu einer vollständigen Lern- und Programmierumgebung weiterzuentwickeln.
|
|
||||||
|
|
||||||
Die Codeanzeige ist standardmäßig ausgeblendet kann aber einfach durch eine Klick auf das `</>` Icon hinzugefügt werden.
|
|
||||||
|
|
||||||
### Login mit openSenseMap/senseBox Account
|
|
||||||
|
|
||||||
Im Menü unter Login könnt ihr euch mit eurem openSenseMap Account anmelden. Sobald ihr angemeldet seid habt ihr die Möglichkeit Projekte online zu speichern.
|
|
||||||
Sobald der Login mit dem openSenseMap Account erfolgreich war lassen sich die bereits registrierten senseBox unter Account einsehen.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
Im Block zum senden an die openSenseMap müssen dann auch keine IDs mehr ausgewählt werden sondern die registrierten senseBox können einfach aus dem Dropdown Menü ausgewählt werden.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Speichern von Projekten
|
|
||||||
|
|
||||||
Nach dem Login über den openSenseMap Account lassen sich Projekte online speichern und wieder abrufen
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### Tutorials
|
|
||||||
|
|
||||||
Es gibt jetzt Tutorials! Eine reihe von verschiedenen Tutorials zeigt dir die ersten Schritte in der Programmierung mit Blockly. (Inhalte werden noch ausgebaut)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Gallery
|
|
||||||
|
|
||||||
In der Gallery finden sich Beispiele mit verschiedenen Programmen. Die Beispiele können direkt in Blockly geöffnet werden, um Änderungen vorzunehmen oder das Programm direkt auf deine senseBox zu übertragen.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### Teilen von Programmen
|
|
||||||
|
|
||||||
Über den Share Button kann ein Link zum Teilen der aktuellen Blöcke erstellt werden. Wann immer du dein Projekt mit anderen Teilen willst musst du nicht mehr eine XML Datei erstellen und verschicken sondern kannst einen Link erstellen, der direkt zu deinem Programm führt. Beachte, dass vor dem Teilen von Blöcken sämtliche sensiblen Daten, wie zum Beispiel Passwörter, Netzwerknamen, Lora oder openSenseMap Keys entfernt werden sollten. Die Links zum teilen von Programmen laufen nach 30 Tagen ab.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
## Fehler
|
|
||||||
|
|
||||||
Falls ihr Fehler findet legt bitte ein Issue in folgendem Repository an: https://github.com/sensebox/React-Ardublockly/issues
|
|
||||||
|
|
||||||
@@ -2,18 +2,18 @@
|
|||||||
|
|
||||||
# React Ardublockly
|
# React Ardublockly
|
||||||
|
|
||||||
This repository contains the source code and documentation of [sensebox-ardublockly](https://sensebox-ardublockly.netlify.app/).
|
This repository contains the source code and documentation of [sensebox-ardublockly](https://sensebox-ardublockly.netlify.app/) :rocket:.
|
||||||
|
|
||||||
This project was created with [Create React App](https://github.com/facebook/create-react-app) and represents the continuation or improvement of [blockly.sensebox.de](https://blockly.sensebox.de/ardublockly/?lang=de&board=sensebox-mcu).
|
This project was created with [Create React App](https://github.com/facebook/create-react-app) and represents the continuation or improvement of [blockly.sensebox.de](https://blockly.sensebox.de/ardublockly/?lang=de&board=sensebox-mcu).
|
||||||
|
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
1. [Download](https://github.com/sensebox/React-Ardublockly/archive/master.zip) or clone the GitHub Repository ``git clone https://github.com/sensebox/React-Ardublockly`` and checkout to branch ``master``.
|
1. [Download](https://github.com/sensebox/React-Ardublockly/archive/bachelor.zip) or clone the GitHub Repository ``git clone https://github.com/sensebox/React-Ardublockly`` and checkout to branch ``bachelor``.
|
||||||
|
|
||||||
2. install [Node.js v10.xx](https://nodejs.org/en/) on your local machine
|
2. install [Node.js v10.xx](https://nodejs.org/en/) on your local machine
|
||||||
|
|
||||||
3. open shell and navigate inside folder ``React-Ardublockly``
|
3. open shell and navigate inside folder ``React-Ardublockly`` or rather ``Quellcode``
|
||||||
* run ``npm install``
|
* run ``npm install``
|
||||||
* run ``npm start``
|
* run ``npm start``
|
||||||
4. open [localhost:3000](http://localhost:3000)
|
4. open [localhost:3000](http://localhost:3000)
|
||||||
@@ -22,4 +22,7 @@ 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 [https://blockly-react.netlify.app/](https://blockly-react.netlify.app/) :rocket:.
|
A demo of the current status of the bachelor branch can be accessed via [sensebox-ardublockly.netlify.app](https://sensebox-ardublockly.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)
|
||||||
|
|||||||
@@ -4,43 +4,29 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@blockly/block-plus-minus": "^2.0.10",
|
"@blockly/block-plus-minus": "^2.0.10",
|
||||||
"@blockly/field-grid-dropdown": "^1.0.25",
|
|
||||||
"@blockly/field-slider": "^2.1.1",
|
"@blockly/field-slider": "^2.1.1",
|
||||||
"@blockly/plugin-scroll-options": "^1.0.2",
|
"@blockly/plugin-typed-variable-modal": "^3.1.1",
|
||||||
"@blockly/plugin-typed-variable-modal": "^3.1.26",
|
|
||||||
"@blockly/zoom-to-fit": "^2.0.7",
|
|
||||||
"@fortawesome/fontawesome-svg-core": "^1.2.30",
|
"@fortawesome/fontawesome-svg-core": "^1.2.30",
|
||||||
"@fortawesome/free-solid-svg-icons": "^5.14.0",
|
"@fortawesome/free-solid-svg-icons": "^5.14.0",
|
||||||
"@fortawesome/react-fontawesome": "^0.1.11",
|
"@fortawesome/react-fontawesome": "^0.1.11",
|
||||||
"@material-ui/core": "^4.11.0",
|
"@material-ui/core": "^4.11.0",
|
||||||
"@sentry/react": "^6.0.0",
|
"@testing-library/jest-dom": "^4.2.4",
|
||||||
"@sentry/tracing": "^6.0.0",
|
"@testing-library/react": "^9.5.0",
|
||||||
"@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.22.0",
|
"blockly": "^3.20200924.0",
|
||||||
"blockly": "^6.20210701.0",
|
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"mnemonic-id": "^3.2.7",
|
|
||||||
"moment": "^2.28.0",
|
"moment": "^2.28.0",
|
||||||
"prismjs": "^1.27.0",
|
"prismjs": "^1.20.0",
|
||||||
"react": "^17.0.2",
|
"react": "^16.13.1",
|
||||||
"react-cookie-consent": "^7.0.0",
|
"react-dom": "^16.13.1",
|
||||||
"react-dom": "^17.0.2",
|
"react-redux": "^7.2.0",
|
||||||
"react-markdown": "^5.0.2",
|
|
||||||
"react-mde": "^11.5.0",
|
|
||||||
"react-redux": "^7.2.4",
|
|
||||||
"react-router-dom": "^5.2.0",
|
"react-router-dom": "^5.2.0",
|
||||||
"react-scripts": "^4.0.3",
|
"react-scripts": "3.4.1",
|
||||||
"reactour": "^1.18.0",
|
|
||||||
"redux": "^4.0.5",
|
"redux": "^4.0.5",
|
||||||
"redux-thunk": "^2.3.0",
|
"redux-thunk": "^2.3.0"
|
||||||
"styled-components": "^4.4.1",
|
|
||||||
"uuid": "^8.3.1"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts 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",
|
||||||
"eject": "react-scripts eject"
|
"eject": "react-scripts eject"
|
||||||
|
|||||||
@@ -24,13 +24,6 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
<!-- Matomo Image Tracker-->
|
|
||||||
<img
|
|
||||||
src="https://piwik.sensebox.kaufen/matomo.php?idsite=9&rec=1"
|
|
||||||
style="border: 0; display: none"
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
<!-- End Matomo -->
|
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<!--
|
<!--
|
||||||
This HTML file is a template.
|
This HTML file is a template.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 194 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 199 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 381 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 239 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 319 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 286 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 641 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 472 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 47 KiB |
@@ -5,47 +5,3 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
padding-bottom: 60px; /* height of your footer + 30px*/
|
padding-bottom: 60px; /* height of your footer + 30px*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.tutorial img{
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
max-height: 40vH;
|
|
||||||
max-width: 100%;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
import React, { Component } from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import { BrowserRouter as Router } from 'react-router-dom';
|
import { BrowserRouter as 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 './App.css';
|
import './App.css';
|
||||||
|
|
||||||
import { ThemeProvider, createMuiTheme } from '@material-ui/core/styles';
|
import { ThemeProvider, createMuiTheme } from '@material-ui/core/styles';
|
||||||
|
|
||||||
import Content from './components/Content';
|
import Navbar from './components/Navbar';
|
||||||
|
import Footer from './components/Footer';
|
||||||
|
import Routes from './components/Routes';
|
||||||
|
|
||||||
const theme = createMuiTheme({
|
const theme = createMuiTheme({
|
||||||
palette: {
|
palette: {
|
||||||
@@ -21,31 +22,27 @@ const theme = createMuiTheme({
|
|||||||
},
|
},
|
||||||
secondary: {
|
secondary: {
|
||||||
main: '#DDDDDD'
|
main: '#DDDDDD'
|
||||||
},
|
|
||||||
button: {
|
|
||||||
compile: '#e27136'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
class App extends Component {
|
const customHistory = createBrowserHistory();
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
store.dispatch(loadUser());
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
function App() {
|
||||||
const customHistory = createBrowserHistory();
|
return (
|
||||||
return (
|
<ThemeProvider theme={theme}>
|
||||||
<ThemeProvider theme={theme}>
|
<Provider store={store}>
|
||||||
<Provider store={store}>
|
<Router history={customHistory}>
|
||||||
<Router history={customHistory}>
|
<div className="wrapper">
|
||||||
<Content />
|
<Navbar />
|
||||||
</Router>
|
<Routes />
|
||||||
</Provider>
|
<Footer />
|
||||||
</ThemeProvider>
|
</div>
|
||||||
);
|
</Router>
|
||||||
}
|
</Provider>
|
||||||
|
</ThemeProvider>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|||||||
@@ -1,264 +0,0 @@
|
|||||||
import {
|
|
||||||
GET_STATUS,
|
|
||||||
USER_LOADED,
|
|
||||||
USER_LOADING,
|
|
||||||
AUTH_ERROR,
|
|
||||||
LOGIN_SUCCESS,
|
|
||||||
LOGIN_FAIL,
|
|
||||||
LOGOUT_SUCCESS,
|
|
||||||
LOGOUT_FAIL,
|
|
||||||
REFRESH_TOKEN_SUCCESS,
|
|
||||||
} from "../actions/types";
|
|
||||||
|
|
||||||
import axios from "axios";
|
|
||||||
import { returnErrors, returnSuccess } from "./messageActions";
|
|
||||||
import { setLanguage } from "./generalActions";
|
|
||||||
|
|
||||||
// Check token & load user
|
|
||||||
export const loadUser = () => (dispatch) => {
|
|
||||||
// user loading
|
|
||||||
dispatch({
|
|
||||||
type: USER_LOADING,
|
|
||||||
});
|
|
||||||
const config = {
|
|
||||||
success: (res) => {
|
|
||||||
dispatch({
|
|
||||||
type: GET_STATUS,
|
|
||||||
payload: res.data.user.status,
|
|
||||||
});
|
|
||||||
dispatch(setLanguage(res.data.user.language));
|
|
||||||
dispatch({
|
|
||||||
type: USER_LOADED,
|
|
||||||
payload: res.data.user,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
error: (err) => {
|
|
||||||
if (err.response) {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status));
|
|
||||||
}
|
|
||||||
var status = [];
|
|
||||||
if (window.localStorage.getItem("status")) {
|
|
||||||
status = JSON.parse(window.localStorage.getItem("status"));
|
|
||||||
}
|
|
||||||
dispatch({
|
|
||||||
type: GET_STATUS,
|
|
||||||
payload: status,
|
|
||||||
});
|
|
||||||
dispatch({
|
|
||||||
type: AUTH_ERROR,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
axios
|
|
||||||
.get(
|
|
||||||
`${process.env.REACT_APP_BLOCKLY_API}/user`,
|
|
||||||
config,
|
|
||||||
dispatch(authInterceptor())
|
|
||||||
)
|
|
||||||
.then((res) => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
err.config.error(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var logoutTimerId;
|
|
||||||
const timeToLogout = 14.9 * 60 * 1000; // nearly 15 minutes corresponding to the API
|
|
||||||
|
|
||||||
// Login user
|
|
||||||
export const login =
|
|
||||||
({ email, password }) =>
|
|
||||||
(dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
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,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Logout User
|
|
||||||
export const logout = () => (dispatch) => {
|
|
||||||
const config = {
|
|
||||||
success: (res) => {
|
|
||||||
dispatch({
|
|
||||||
type: LOGOUT_SUCCESS,
|
|
||||||
});
|
|
||||||
var status = [];
|
|
||||||
if (window.localStorage.getItem("status")) {
|
|
||||||
status = JSON.parse(window.localStorage.getItem("status"));
|
|
||||||
}
|
|
||||||
dispatch({
|
|
||||||
type: GET_STATUS,
|
|
||||||
payload: status,
|
|
||||||
});
|
|
||||||
var locale = "en_US";
|
|
||||||
if (window.localStorage.getItem("locale")) {
|
|
||||||
locale = window.localStorage.getItem("locale");
|
|
||||||
} else if (navigator.language === "de-DE") {
|
|
||||||
locale = "de_DE";
|
|
||||||
}
|
|
||||||
dispatch(setLanguage(locale));
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status, "LOGOUT_SUCCESS"));
|
|
||||||
clearTimeout(logoutTimerId);
|
|
||||||
},
|
|
||||||
error: (err) => {
|
|
||||||
dispatch(
|
|
||||||
returnErrors(
|
|
||||||
err.response.data.message,
|
|
||||||
err.response.status,
|
|
||||||
"LOGOUT_FAIL"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
dispatch({
|
|
||||||
type: LOGOUT_FAIL,
|
|
||||||
});
|
|
||||||
var status = [];
|
|
||||||
if (window.localStorage.getItem("status")) {
|
|
||||||
status = JSON.parse(window.localStorage.getItem("status"));
|
|
||||||
}
|
|
||||||
dispatch({
|
|
||||||
type: GET_STATUS,
|
|
||||||
payload: status,
|
|
||||||
});
|
|
||||||
clearTimeout(logoutTimerId);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
axios
|
|
||||||
.post("https://api.opensensemap.org/users/sign-out", {}, config)
|
|
||||||
.then((res) => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
if (err.response && err.response.status !== 401) {
|
|
||||||
err.config.error(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const authInterceptor = () => (dispatch, getState) => {
|
|
||||||
// Add a request interceptor
|
|
||||||
axios.interceptors.request.use(
|
|
||||||
(config) => {
|
|
||||||
config.headers["Content-Type"] = "application/json";
|
|
||||||
const token = getState().auth.token;
|
|
||||||
if (token) {
|
|
||||||
config.headers["Authorization"] = `Bearer ${token}`;
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
},
|
|
||||||
(error) => {
|
|
||||||
Promise.reject(error);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Add a response interceptor
|
|
||||||
axios.interceptors.response.use(
|
|
||||||
(response) => {
|
|
||||||
// request was successfull
|
|
||||||
return response;
|
|
||||||
},
|
|
||||||
(error) => {
|
|
||||||
const originalRequest = error.config;
|
|
||||||
const refreshToken = getState().auth.refreshToken;
|
|
||||||
if (refreshToken) {
|
|
||||||
// try to refresh the token failed
|
|
||||||
if (error.response.status === 401 && originalRequest._retry) {
|
|
||||||
// router.push('/login');
|
|
||||||
return Promise.reject(error);
|
|
||||||
}
|
|
||||||
// token was not valid and 1st try to refresh the token
|
|
||||||
if (error.response.status === 401 && !originalRequest._retry) {
|
|
||||||
originalRequest._retry = true;
|
|
||||||
const refreshToken = getState().auth.refreshToken;
|
|
||||||
// request to refresh the token, in request-body is the refreshToken
|
|
||||||
axios
|
|
||||||
.post("https://api.opensensemap.org/users/refresh-auth", {
|
|
||||||
token: refreshToken,
|
|
||||||
})
|
|
||||||
.then((res) => {
|
|
||||||
if (res.status === 200) {
|
|
||||||
clearTimeout(logoutTimerId);
|
|
||||||
const logoutTimer = () =>
|
|
||||||
setTimeout(() => dispatch(logout()), timeToLogout);
|
|
||||||
logoutTimerId = logoutTimer();
|
|
||||||
dispatch({
|
|
||||||
type: REFRESH_TOKEN_SUCCESS,
|
|
||||||
payload: res.data,
|
|
||||||
});
|
|
||||||
axios.defaults.headers.common["Authorization"] =
|
|
||||||
"Bearer " + getState().auth.token;
|
|
||||||
// request was successfull, new request with the old parameters and the refreshed token
|
|
||||||
return axios(originalRequest)
|
|
||||||
.then((res) => {
|
|
||||||
originalRequest.success(res);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
originalRequest.error(err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return Promise.reject(error);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
// request failed, token could not be refreshed
|
|
||||||
if (err.response) {
|
|
||||||
dispatch(
|
|
||||||
returnErrors(err.response.data.message, err.response.status)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
dispatch({
|
|
||||||
type: AUTH_ERROR,
|
|
||||||
});
|
|
||||||
return Promise.reject(error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// request status was unequal to 401, no possibility to refresh the token
|
|
||||||
return Promise.reject(error);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,52 +1,8 @@
|
|||||||
import {
|
import { VISIT } from './types';
|
||||||
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) => {
|
|
||||||
if (!getState().auth.progress && !getState().auth.isAuthenticated) {
|
|
||||||
window.localStorage.setItem("locale", language);
|
|
||||||
}
|
|
||||||
dispatch({
|
|
||||||
type: LANGUAGE,
|
|
||||||
payload: language,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setRenderer = (renderer) => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: RENDERER,
|
|
||||||
payload: renderer,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setSounds = (sounds) => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: SOUNDS,
|
|
||||||
payload: sounds,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setStatistics = (showStatistics) => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: STATISTICS,
|
|
||||||
payload: showStatistics,
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
import { GET_ERRORS, CLEAR_MESSAGES, GET_SUCCESS } from './types';
|
|
||||||
|
|
||||||
// RETURN Errors
|
|
||||||
export const returnErrors = (msg, status, id = null) => {
|
|
||||||
return {
|
|
||||||
type: GET_ERRORS,
|
|
||||||
payload: {
|
|
||||||
msg: msg,
|
|
||||||
status: status,
|
|
||||||
id: id
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// RETURN Success
|
|
||||||
export const returnSuccess = (msg, status, id = null) => {
|
|
||||||
return {
|
|
||||||
type: GET_SUCCESS,
|
|
||||||
payload: {
|
|
||||||
msg: msg,
|
|
||||||
status: status,
|
|
||||||
id: id
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// CLEAR_MESSAGES
|
|
||||||
export const clearMessages = () => {
|
|
||||||
return {
|
|
||||||
type: CLEAR_MESSAGES
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
import { PROJECT_PROGRESS, GET_PROJECT, GET_PROJECTS, PROJECT_TYPE, PROJECT_DESCRIPTION } from './types';
|
|
||||||
|
|
||||||
import axios from 'axios';
|
|
||||||
import { returnErrors, returnSuccess } from './messageActions';
|
|
||||||
|
|
||||||
export const setType = (type) => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: PROJECT_TYPE,
|
|
||||||
payload: type
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setDescription = (description) => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: PROJECT_DESCRIPTION,
|
|
||||||
payload: description
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getProject = (type, id) => (dispatch) => {
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
dispatch(setType(type));
|
|
||||||
const config = {
|
|
||||||
success: res => {
|
|
||||||
var data = type === 'share' ? 'content' : type;
|
|
||||||
var project = res.data[data];
|
|
||||||
if (project) {
|
|
||||||
dispatch({
|
|
||||||
type: GET_PROJECT,
|
|
||||||
payload: project
|
|
||||||
});
|
|
||||||
dispatch({
|
|
||||||
type: PROJECT_DESCRIPTION,
|
|
||||||
payload: project.description
|
|
||||||
});
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status, 'GET_PROJECT_SUCCESS'));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
dispatch(returnErrors(res.data.message, res.status, 'PROJECT_EMPTY'));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: err => {
|
|
||||||
if (err.response) {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status, 'GET_PROJECT_FAIL'));
|
|
||||||
}
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
axios.get(`${process.env.REACT_APP_BLOCKLY_API}/${type}/${id}`, config)
|
|
||||||
.then(res => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
err.config.error(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getProjects = (type) => (dispatch) => {
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
const config = {
|
|
||||||
success: res => {
|
|
||||||
var data = type === 'project' ? 'projects' : 'galleries';
|
|
||||||
var projects = res.data[data];
|
|
||||||
dispatch({
|
|
||||||
type: GET_PROJECTS,
|
|
||||||
payload: projects
|
|
||||||
});
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status));
|
|
||||||
},
|
|
||||||
error: err => {
|
|
||||||
if (err.response) {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status, 'GET_PROJECTS_FAIL'));
|
|
||||||
}
|
|
||||||
dispatch({ type: PROJECT_PROGRESS });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
axios.get(`${process.env.REACT_APP_BLOCKLY_API}/${type}`, config)
|
|
||||||
.then(res => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
err.config.error(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateProject = (type, id) => (dispatch, getState) => {
|
|
||||||
var workspace = getState().workspace;
|
|
||||||
var body = {
|
|
||||||
xml: workspace.code.xml,
|
|
||||||
title: workspace.name
|
|
||||||
};
|
|
||||||
var project = getState().project;
|
|
||||||
if (type === 'gallery') {
|
|
||||||
body.description = project.description;
|
|
||||||
}
|
|
||||||
const config = {
|
|
||||||
success: res => {
|
|
||||||
var project = res.data[type];
|
|
||||||
var projects = getState().project.projects;
|
|
||||||
var index = projects.findIndex(res => res._id === project._id);
|
|
||||||
projects[index] = project;
|
|
||||||
dispatch({
|
|
||||||
type: GET_PROJECTS,
|
|
||||||
payload: projects
|
|
||||||
});
|
|
||||||
if (type === 'project') {
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status, 'PROJECT_UPDATE_SUCCESS'));
|
|
||||||
} else {
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status, 'GALLERY_UPDATE_SUCCESS'));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: err => {
|
|
||||||
if (err.response) {
|
|
||||||
if (type === 'project') {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status, 'PROJECT_UPDATE_FAIL'));
|
|
||||||
} else {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status, 'GALLERY_UPDATE_FAIL'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
axios.put(`${process.env.REACT_APP_BLOCKLY_API}/${type}/${id}`, body, config)
|
|
||||||
.then(res => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
err.config.error(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteProject = (type, id) => (dispatch, getState) => {
|
|
||||||
const config = {
|
|
||||||
success: res => {
|
|
||||||
var projects = getState().project.projects;
|
|
||||||
var index = projects.findIndex(res => res._id === id);
|
|
||||||
projects.splice(index, 1)
|
|
||||||
dispatch({
|
|
||||||
type: GET_PROJECTS,
|
|
||||||
payload: projects
|
|
||||||
});
|
|
||||||
if (type === 'project') {
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status, 'PROJECT_DELETE_SUCCESS'));
|
|
||||||
} else {
|
|
||||||
dispatch(returnSuccess(res.data.message, res.status, 'GALLERY_DELETE_SUCCESS'));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: err => {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status, 'PROJECT_DELETE_FAIL'));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
axios.delete(`${process.env.REACT_APP_BLOCKLY_API}/${type}/${id}`, config)
|
|
||||||
.then(res => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
if (err.response && err.response.status !== 401) {
|
|
||||||
err.config.error(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
export const shareProject = (title, type, id) => (dispatch, getState) => {
|
|
||||||
var body = {
|
|
||||||
title: title
|
|
||||||
};
|
|
||||||
if (type === 'project') {
|
|
||||||
body.projectId = id;
|
|
||||||
} else {
|
|
||||||
body.xml = getState().workspace.code.xml;
|
|
||||||
}
|
|
||||||
axios.post(`${process.env.REACT_APP_BLOCKLY_API}/share`, body)
|
|
||||||
.then(res => {
|
|
||||||
var shareContent = res.data.content;
|
|
||||||
if (body.projectId) {
|
|
||||||
var projects = getState().project.projects;
|
|
||||||
var index = projects.findIndex(res => res._id === id);
|
|
||||||
projects[index].shared = shareContent.expiresAt;
|
|
||||||
dispatch({
|
|
||||||
type: GET_PROJECTS,
|
|
||||||
payload: projects
|
|
||||||
});
|
|
||||||
}
|
|
||||||
dispatch(returnSuccess(res.data.message, shareContent._id, 'SHARE_SUCCESS'));
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
if (err.response) {
|
|
||||||
dispatch(returnErrors(err.response.data.message, err.response.status, 'SHARE_FAIL'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
export const resetProject = () => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: GET_PROJECTS,
|
|
||||||
payload: []
|
|
||||||
});
|
|
||||||
dispatch(setType(''));
|
|
||||||
dispatch(setDescription(''));
|
|
||||||
};
|
|
||||||
@@ -1,274 +1,61 @@
|
|||||||
import {
|
import { TUTORIAL_SUCCESS, TUTORIAL_ERROR, TUTORIAL_CHANGE, TUTORIAL_XML, TUTORIAL_ID, TUTORIAL_STEP } from './types';
|
||||||
TUTORIAL_PROGRESS,
|
|
||||||
GET_TUTORIAL,
|
|
||||||
GET_TUTORIALS,
|
|
||||||
TUTORIAL_SUCCESS,
|
|
||||||
TUTORIAL_ERROR,
|
|
||||||
TUTORIAL_CHANGE,
|
|
||||||
TUTORIAL_XML,
|
|
||||||
TUTORIAL_STEP,
|
|
||||||
} from "./types";
|
|
||||||
|
|
||||||
import axios from "axios";
|
import tutorials from '../data/tutorials';
|
||||||
import { returnErrors, returnSuccess } from "./messageActions";
|
|
||||||
|
|
||||||
export const tutorialProgress = () => (dispatch) => {
|
|
||||||
dispatch({ type: TUTORIAL_PROGRESS });
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getTutorial = (id) => (dispatch, getState) => {
|
|
||||||
axios
|
|
||||||
.get(`${process.env.REACT_APP_BLOCKLY_API}/tutorial/${id}`)
|
|
||||||
.then((res) => {
|
|
||||||
var tutorial = res.data.tutorial;
|
|
||||||
existingTutorial(tutorial, getState().tutorial.status).then((status) => {
|
|
||||||
dispatch({
|
|
||||||
type: TUTORIAL_SUCCESS,
|
|
||||||
payload: status,
|
|
||||||
});
|
|
||||||
dispatch(updateStatus(status));
|
|
||||||
dispatch({
|
|
||||||
type: GET_TUTORIAL,
|
|
||||||
payload: tutorial,
|
|
||||||
});
|
|
||||||
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_TUTORIAL_FAIL"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
dispatch({ type: TUTORIAL_PROGRESS });
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getTutorials = () => (dispatch, getState) => {
|
|
||||||
axios
|
|
||||||
.get(`${process.env.REACT_APP_BLOCKLY_API}/tutorial`)
|
|
||||||
.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 updateStatus = (status) => (dispatch, getState) => {
|
|
||||||
if (getState().auth.isAuthenticated) {
|
|
||||||
// update user account in database - sync with redux store
|
|
||||||
axios
|
|
||||||
.put(`${process.env.REACT_APP_BLOCKLY_API}/user/status`, {
|
|
||||||
status: status,
|
|
||||||
})
|
|
||||||
.then((res) => {})
|
|
||||||
.catch((err) => {
|
|
||||||
if (err.response) {
|
|
||||||
// dispatch(returnErrors(err.response.data.message, err.response.status, 'UPDATE_STATUS_FAIL'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// update locale storage - sync with redux store
|
|
||||||
window.localStorage.setItem("status", JSON.stringify(status));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteTutorial = (id) => (dispatch, getState) => {
|
|
||||||
var tutorial = getState().tutorial;
|
|
||||||
var id = getState().builder.id;
|
|
||||||
const config = {
|
|
||||||
success: (res) => {
|
|
||||||
var tutorials = tutorial.tutorials;
|
|
||||||
var index = tutorials.findIndex((res) => res._id === id);
|
|
||||||
tutorials.splice(index, 1);
|
|
||||||
dispatch({
|
|
||||||
type: GET_TUTORIALS,
|
|
||||||
payload: tutorials,
|
|
||||||
});
|
|
||||||
dispatch(
|
|
||||||
returnSuccess(res.data.message, res.status, "TUTORIAL_DELETE_SUCCESS")
|
|
||||||
);
|
|
||||||
},
|
|
||||||
error: (err) => {
|
|
||||||
dispatch(
|
|
||||||
returnErrors(
|
|
||||||
err.response.data.message,
|
|
||||||
err.response.status,
|
|
||||||
"TUTORIAL_DELETE_FAIL"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
axios
|
|
||||||
.delete(`${process.env.REACT_APP_BLOCKLY_API}/tutorial/${id}`, config)
|
|
||||||
.then((res) => {
|
|
||||||
res.config.success(res);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
if (err.response && err.response.status !== 401) {
|
|
||||||
err.config.error(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const resetTutorial = () => (dispatch) => {
|
|
||||||
dispatch({
|
|
||||||
type: GET_TUTORIALS,
|
|
||||||
payload: [],
|
|
||||||
});
|
|
||||||
dispatch({
|
|
||||||
type: TUTORIAL_STEP,
|
|
||||||
payload: 0,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const tutorialChange = () => (dispatch) => {
|
export const tutorialChange = () => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: TUTORIAL_CHANGE,
|
type: TUTORIAL_CHANGE
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const tutorialCheck = (status, step) => (dispatch, getState) => {
|
export const tutorialCheck = (status, step) => (dispatch, getState) => {
|
||||||
var tutorialsStatus = getState().tutorial.status;
|
var tutorialsStatus = getState().tutorial.status;
|
||||||
var id = getState().tutorial.tutorials[0]._id;
|
var id = getState().tutorial.currentId;
|
||||||
var tutorialsStatusIndex = tutorialsStatus.findIndex(
|
var tutorialsStatusIndex = tutorialsStatus.findIndex(tutorialStatus => tutorialStatus.id === id);
|
||||||
(tutorialStatus) => tutorialStatus._id === id
|
var tasksIndex = tutorialsStatus[tutorialsStatusIndex].tasks.findIndex(task => task.id === step.id);
|
||||||
);
|
|
||||||
var tasksIndex = tutorialsStatus[tutorialsStatusIndex].tasks.findIndex(
|
|
||||||
(task) => task._id === step._id
|
|
||||||
);
|
|
||||||
tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex] = {
|
tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex] = {
|
||||||
...tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex],
|
...tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex],
|
||||||
type: status,
|
type: status
|
||||||
};
|
};
|
||||||
dispatch({
|
dispatch({
|
||||||
type: status === "success" ? TUTORIAL_SUCCESS : TUTORIAL_ERROR,
|
type: status === 'success' ? TUTORIAL_SUCCESS : TUTORIAL_ERROR,
|
||||||
payload: tutorialsStatus,
|
payload: tutorialsStatus
|
||||||
});
|
});
|
||||||
dispatch(updateStatus(tutorialsStatus));
|
|
||||||
dispatch(tutorialChange());
|
dispatch(tutorialChange());
|
||||||
dispatch(returnSuccess("", "", "TUTORIAL_CHECK_SUCCESS"));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const storeTutorialXml = (code) => (dispatch, getState) => {
|
export const storeTutorialXml = (code) => (dispatch, getState) => {
|
||||||
var tutorial = getState().tutorial.tutorials[0];
|
var id = getState().tutorial.currentId;
|
||||||
if (tutorial) {
|
if (id !== null) {
|
||||||
var id = tutorial._id;
|
|
||||||
var activeStep = getState().tutorial.activeStep;
|
var activeStep = getState().tutorial.activeStep;
|
||||||
var steps = tutorial.steps;
|
var steps = tutorials.filter(tutorial => tutorial.id === id)[0].steps;
|
||||||
if (steps && steps[activeStep].type === "task") {
|
if (steps[activeStep].type === 'task') {
|
||||||
var tutorialsStatus = getState().tutorial.status;
|
var tutorialsStatus = getState().tutorial.status;
|
||||||
var tutorialsStatusIndex = tutorialsStatus.findIndex(
|
var tutorialsStatusIndex = tutorialsStatus.findIndex(tutorialStatus => tutorialStatus.id === id);
|
||||||
(tutorialStatus) => tutorialStatus._id === id
|
var tasksIndex = tutorialsStatus[tutorialsStatusIndex].tasks.findIndex(task => task.id === steps[activeStep].id);
|
||||||
);
|
|
||||||
var tasksIndex = tutorialsStatus[tutorialsStatusIndex].tasks.findIndex(
|
|
||||||
(task) => task._id === steps[activeStep]._id
|
|
||||||
);
|
|
||||||
tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex] = {
|
tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex] = {
|
||||||
...tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex],
|
...tutorialsStatus[tutorialsStatusIndex].tasks[tasksIndex],
|
||||||
xml: code,
|
xml: code
|
||||||
};
|
};
|
||||||
dispatch({
|
dispatch({
|
||||||
type: TUTORIAL_XML,
|
type: TUTORIAL_XML,
|
||||||
payload: tutorialsStatus,
|
payload: tutorialsStatus
|
||||||
});
|
});
|
||||||
dispatch(updateStatus(tutorialsStatus));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export const tutorialId = (id) => (dispatch) => {
|
||||||
|
dispatch({
|
||||||
|
type: TUTORIAL_ID,
|
||||||
|
payload: id
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const tutorialStep = (step) => (dispatch) => {
|
export const tutorialStep = (step) => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: TUTORIAL_STEP,
|
type: TUTORIAL_STEP,
|
||||||
payload: step,
|
payload: step
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const existingTutorials = (tutorials, status) =>
|
|
||||||
new Promise(function (resolve, reject) {
|
|
||||||
var newstatus;
|
|
||||||
new Promise(function (resolve, reject) {
|
|
||||||
var existingTutorialIds = tutorials.map((tutorial, i) => {
|
|
||||||
existingTutorial(tutorial, status).then((status) => {
|
|
||||||
newstatus = status;
|
|
||||||
});
|
|
||||||
return tutorial._id;
|
|
||||||
});
|
|
||||||
resolve(existingTutorialIds);
|
|
||||||
}).then((existingTutorialIds) => {
|
|
||||||
// deleting old tutorials which do not longer exist
|
|
||||||
if (existingTutorialIds.length > 0) {
|
|
||||||
status = newstatus.filter(
|
|
||||||
(status) => existingTutorialIds.indexOf(status._id) > -1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
resolve(status);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const existingTutorial = (tutorial, status) =>
|
|
||||||
new Promise(function (resolve, reject) {
|
|
||||||
var tutorialsId = tutorial._id;
|
|
||||||
var statusIndex = status.findIndex((status) => status._id === tutorialsId);
|
|
||||||
if (statusIndex > -1) {
|
|
||||||
var tasks = tutorial.steps.filter((step) => step.type === "task");
|
|
||||||
var existingTaskIds = tasks.map((task, j) => {
|
|
||||||
var tasksId = task._id;
|
|
||||||
if (
|
|
||||||
status[statusIndex].tasks.findIndex(
|
|
||||||
(task) => task._id === tasksId
|
|
||||||
) === -1
|
|
||||||
) {
|
|
||||||
// task does not exist
|
|
||||||
status[statusIndex].tasks.push({ _id: tasksId });
|
|
||||||
}
|
|
||||||
return tasksId;
|
|
||||||
});
|
|
||||||
// deleting old tasks which do not longer exist
|
|
||||||
if (existingTaskIds.length > 0) {
|
|
||||||
status[statusIndex].tasks = status[statusIndex].tasks.filter(
|
|
||||||
(task) => existingTaskIds.indexOf(task._id) > -1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
status.push({
|
|
||||||
_id: tutorialsId,
|
|
||||||
tasks: tutorial.steps
|
|
||||||
.filter((step) => step.type === "task")
|
|
||||||
.map((task) => {
|
|
||||||
return { _id: task._id };
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
resolve(status);
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,36 +1,24 @@
|
|||||||
import {
|
import { PROGRESS, JSON_STRING, BUILDER_CHANGE, BUILDER_ERROR, BUILDER_TITLE, BUILDER_ID, BUILDER_ADD_STEP, BUILDER_DELETE_STEP, BUILDER_CHANGE_STEP, BUILDER_CHANGE_ORDER, BUILDER_DELETE_PROPERTY } from './types';
|
||||||
PROGRESS,
|
|
||||||
JSON_STRING,
|
|
||||||
BUILDER_CHANGE,
|
|
||||||
BUILDER_ERROR,
|
|
||||||
BUILDER_TITLE,
|
|
||||||
BUILDER_ID,
|
|
||||||
BUILDER_ADD_STEP,
|
|
||||||
BUILDER_DELETE_STEP,
|
|
||||||
BUILDER_CHANGE_STEP,
|
|
||||||
BUILDER_CHANGE_ORDER,
|
|
||||||
BUILDER_DELETE_PROPERTY,
|
|
||||||
} from "./types";
|
|
||||||
|
|
||||||
import data from "../data/hardware.json";
|
import data from '../data/hardware.json';
|
||||||
|
|
||||||
export const changeTutorialBuilder = () => (dispatch) => {
|
export const changeTutorialBuilder = () => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_CHANGE,
|
type: BUILDER_CHANGE
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const jsonString = (json) => (dispatch) => {
|
export const jsonString = (json) => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: JSON_STRING,
|
type: JSON_STRING,
|
||||||
payload: json,
|
payload: json
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const tutorialTitle = (title) => (dispatch) => {
|
export const tutorialTitle = (title) => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_TITLE,
|
type: BUILDER_TITLE,
|
||||||
payload: title,
|
payload: title
|
||||||
});
|
});
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
};
|
};
|
||||||
@@ -38,7 +26,7 @@ export const tutorialTitle = (title) => (dispatch) => {
|
|||||||
export const tutorialSteps = (steps) => (dispatch) => {
|
export const tutorialSteps = (steps) => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ADD_STEP,
|
type: BUILDER_ADD_STEP,
|
||||||
payload: steps,
|
payload: steps
|
||||||
});
|
});
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
};
|
};
|
||||||
@@ -46,7 +34,7 @@ export const tutorialSteps = (steps) => (dispatch) => {
|
|||||||
export const tutorialId = (id) => (dispatch) => {
|
export const tutorialId = (id) => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ID,
|
type: BUILDER_ID,
|
||||||
payload: id,
|
payload: id
|
||||||
});
|
});
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
};
|
};
|
||||||
@@ -55,14 +43,14 @@ export const addStep = (index) => (dispatch, getState) => {
|
|||||||
var steps = getState().builder.steps;
|
var steps = getState().builder.steps;
|
||||||
var step = {
|
var step = {
|
||||||
id: index + 1,
|
id: index + 1,
|
||||||
type: "instruction",
|
type: 'instruction',
|
||||||
headline: "",
|
headline: '',
|
||||||
text: "",
|
text: ''
|
||||||
};
|
};
|
||||||
steps.splice(index, 0, step);
|
steps.splice(index, 0, step);
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ADD_STEP,
|
type: BUILDER_ADD_STEP,
|
||||||
payload: steps,
|
payload: steps
|
||||||
});
|
});
|
||||||
dispatch(addErrorStep(index));
|
dispatch(addErrorStep(index));
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
@@ -73,7 +61,7 @@ export const addErrorStep = (index) => (dispatch, getState) => {
|
|||||||
error.steps.splice(index, 0, {});
|
error.steps.splice(index, 0, {});
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ERROR,
|
type: BUILDER_ERROR,
|
||||||
payload: error,
|
payload: error
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -82,7 +70,7 @@ export const removeStep = (index) => (dispatch, getState) => {
|
|||||||
steps.splice(index, 1);
|
steps.splice(index, 1);
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_DELETE_STEP,
|
type: BUILDER_DELETE_STEP,
|
||||||
payload: steps,
|
payload: steps
|
||||||
});
|
});
|
||||||
dispatch(removeErrorStep(index));
|
dispatch(removeErrorStep(index));
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
@@ -93,47 +81,45 @@ export const removeErrorStep = (index) => (dispatch, getState) => {
|
|||||||
error.steps.splice(index, 1);
|
error.steps.splice(index, 1);
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ERROR,
|
type: BUILDER_ERROR,
|
||||||
payload: error,
|
payload: error
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const changeContent =
|
export const changeContent = (content, index, property1, property2) => (dispatch, getState) => {
|
||||||
(content, index, property1, property2) => (dispatch, getState) => {
|
var steps = getState().builder.steps;
|
||||||
var steps = getState().builder.steps;
|
var step = steps[index];
|
||||||
var step = steps[index];
|
if (property2) {
|
||||||
if (property2) {
|
if (step[property1] && step[property1][property2]) {
|
||||||
if (step[property1] && step[property1][property2]) {
|
step[property1][property2] = content;
|
||||||
step[property1][property2] = content;
|
|
||||||
} else {
|
|
||||||
step[property1] = { [property2]: content };
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
step[property1] = content;
|
step[property1] = { [property2]: content };
|
||||||
}
|
}
|
||||||
dispatch({
|
} else {
|
||||||
type: BUILDER_CHANGE_STEP,
|
step[property1] = content;
|
||||||
payload: steps,
|
}
|
||||||
});
|
dispatch({
|
||||||
dispatch(changeTutorialBuilder());
|
type: BUILDER_CHANGE_STEP,
|
||||||
};
|
payload: steps
|
||||||
|
});
|
||||||
|
dispatch(changeTutorialBuilder());
|
||||||
|
};
|
||||||
|
|
||||||
export const deleteProperty =
|
export const deleteProperty = (index, property1, property2) => (dispatch, getState) => {
|
||||||
(index, property1, property2) => (dispatch, getState) => {
|
var steps = getState().builder.steps;
|
||||||
var steps = getState().builder.steps;
|
var step = steps[index];
|
||||||
var step = steps[index];
|
if (property2) {
|
||||||
if (property2) {
|
if (step[property1] && step[property1][property2]) {
|
||||||
if (step[property1] && step[property1][property2]) {
|
delete step[property1][property2];
|
||||||
delete step[property1][property2];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
delete step[property1];
|
|
||||||
}
|
}
|
||||||
dispatch({
|
} else {
|
||||||
type: BUILDER_DELETE_PROPERTY,
|
delete step[property1];
|
||||||
payload: steps,
|
}
|
||||||
});
|
dispatch({
|
||||||
dispatch(changeTutorialBuilder());
|
type: BUILDER_DELETE_PROPERTY,
|
||||||
};
|
payload: steps
|
||||||
|
});
|
||||||
|
dispatch(changeTutorialBuilder());
|
||||||
|
};
|
||||||
|
|
||||||
export const changeStepIndex = (fromIndex, toIndex) => (dispatch, getState) => {
|
export const changeStepIndex = (fromIndex, toIndex) => (dispatch, getState) => {
|
||||||
var steps = getState().builder.steps;
|
var steps = getState().builder.steps;
|
||||||
@@ -142,34 +128,34 @@ export const changeStepIndex = (fromIndex, toIndex) => (dispatch, getState) => {
|
|||||||
steps.splice(toIndex, 0, step);
|
steps.splice(toIndex, 0, step);
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_CHANGE_ORDER,
|
type: BUILDER_CHANGE_ORDER,
|
||||||
payload: steps,
|
payload: steps
|
||||||
});
|
});
|
||||||
dispatch(changeErrorStepIndex(fromIndex, toIndex));
|
dispatch(changeErrorStepIndex(fromIndex, toIndex));
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
};
|
};
|
||||||
|
|
||||||
export const changeErrorStepIndex =
|
export const changeErrorStepIndex = (fromIndex, toIndex) => (dispatch, getState) => {
|
||||||
(fromIndex, toIndex) => (dispatch, getState) => {
|
var error = getState().builder.error;
|
||||||
var error = getState().builder.error;
|
var errorStep = error.steps[fromIndex];
|
||||||
var errorStep = error.steps[fromIndex];
|
error.steps.splice(fromIndex, 1);
|
||||||
error.steps.splice(fromIndex, 1);
|
error.steps.splice(toIndex, 0, errorStep);
|
||||||
error.steps.splice(toIndex, 0, errorStep);
|
dispatch({
|
||||||
dispatch({
|
type: BUILDER_ERROR,
|
||||||
type: BUILDER_ERROR,
|
payload: error
|
||||||
payload: error,
|
});
|
||||||
});
|
};
|
||||||
};
|
|
||||||
|
|
||||||
export const setError = (index, property) => (dispatch, getState) => {
|
export const setError = (index, property) => (dispatch, getState) => {
|
||||||
var error = getState().builder.error;
|
var error = getState().builder.error;
|
||||||
if (index !== undefined) {
|
if (index !== undefined) {
|
||||||
error.steps[index][property] = true;
|
error.steps[index][property] = true;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
error[property] = true;
|
error[property] = true;
|
||||||
}
|
}
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ERROR,
|
type: BUILDER_ERROR,
|
||||||
payload: error,
|
payload: error
|
||||||
});
|
});
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
};
|
};
|
||||||
@@ -178,12 +164,13 @@ export const deleteError = (index, property) => (dispatch, getState) => {
|
|||||||
var error = getState().builder.error;
|
var error = getState().builder.error;
|
||||||
if (index !== undefined) {
|
if (index !== undefined) {
|
||||||
delete error.steps[index][property];
|
delete error.steps[index][property];
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
delete error[property];
|
delete error[property];
|
||||||
}
|
}
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ERROR,
|
type: BUILDER_ERROR,
|
||||||
payload: error,
|
payload: error
|
||||||
});
|
});
|
||||||
dispatch(changeTutorialBuilder());
|
dispatch(changeTutorialBuilder());
|
||||||
};
|
};
|
||||||
@@ -193,11 +180,8 @@ export const setSubmitError = () => (dispatch, getState) => {
|
|||||||
// if(builder.id === undefined || builder.id === ''){
|
// if(builder.id === undefined || builder.id === ''){
|
||||||
// dispatch(setError(undefined, 'id'));
|
// dispatch(setError(undefined, 'id'));
|
||||||
// }
|
// }
|
||||||
if (builder.title === "") {
|
if (builder.id === undefined || builder.title === '') {
|
||||||
dispatch(setError(undefined, "title"));
|
dispatch(setError(undefined, 'title'));
|
||||||
}
|
|
||||||
if (builder.title === null) {
|
|
||||||
dispatch(setError(undefined, "title"));
|
|
||||||
}
|
}
|
||||||
var type = builder.steps.map((step, i) => {
|
var type = builder.steps.map((step, i) => {
|
||||||
// media and xml are directly checked for errors in their components and
|
// media and xml are directly checked for errors in their components and
|
||||||
@@ -205,43 +189,36 @@ export const setSubmitError = () => (dispatch, getState) => {
|
|||||||
step.id = i + 1;
|
step.id = i + 1;
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
if (step.requirements && step.requirements.length > 0) {
|
if (step.requirements && step.requirements.length > 0) {
|
||||||
var requirements = step.requirements.filter((requirement) =>
|
var requirements = step.requirements.filter(requirement => typeof (requirement) === 'number');
|
||||||
/^[0-9a-fA-F]{24}$/.test(requirement)
|
|
||||||
);
|
|
||||||
if (requirements.length < step.requirements.length) {
|
if (requirements.length < step.requirements.length) {
|
||||||
dispatch(changeContent(requirements, i, "requirements"));
|
dispatch(changeContent(requirements, i, 'requirements'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (step.hardware === undefined || step.hardware.length < 1) {
|
if (step.hardware === undefined || step.hardware.length < 1) {
|
||||||
dispatch(setError(i, "hardware"));
|
dispatch(setError(i, 'hardware'));
|
||||||
} else {
|
}
|
||||||
var hardwareIds = data.map((hardware) => hardware.id);
|
else {
|
||||||
var hardware = step.hardware.filter((hardware) =>
|
var hardwareIds = data.map(hardware => hardware.id);
|
||||||
hardwareIds.includes(hardware)
|
var hardware = step.hardware.filter(hardware => hardwareIds.includes(hardware));
|
||||||
);
|
|
||||||
if (hardware.length < step.hardware.length) {
|
if (hardware.length < step.hardware.length) {
|
||||||
dispatch(changeContent(hardware, i, "hardware"));
|
dispatch(changeContent(hardware, i, 'hardware'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (step.headline === undefined || step.headline === "") {
|
if (step.headline === undefined || step.headline === '') {
|
||||||
dispatch(setError(i, "headline"));
|
dispatch(setError(i, 'headline'));
|
||||||
}
|
}
|
||||||
if (step.text === undefined || step.text === "") {
|
if (step.text === undefined || step.text === '') {
|
||||||
dispatch(setError(i, "text"));
|
dispatch(setError(i, 'text'));
|
||||||
}
|
}
|
||||||
return step.type;
|
return step.type;
|
||||||
});
|
});
|
||||||
if (
|
if (!(type.filter(item => item === 'task').length > 0 && type.filter(item => item === 'instruction').length > 0)) {
|
||||||
!(
|
dispatch(setError(undefined, 'type'));
|
||||||
type.filter((item) => item === "task").length > 0 &&
|
|
||||||
type.filter((item) => item === "instruction").length > 0
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
dispatch(setError(undefined, "type"));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export const checkError = () => (dispatch, getState) => {
|
export const checkError = () => (dispatch, getState) => {
|
||||||
dispatch(setSubmitError());
|
dispatch(setSubmitError());
|
||||||
var error = getState().builder.error;
|
var error = getState().builder.error;
|
||||||
@@ -250,37 +227,39 @@ export const checkError = () => (dispatch, getState) => {
|
|||||||
}
|
}
|
||||||
for (var i = 0; i < error.steps.length; i++) {
|
for (var i = 0; i < error.steps.length; i++) {
|
||||||
if (Object.keys(error.steps[i]).length > 0) {
|
if (Object.keys(error.steps[i]).length > 0) {
|
||||||
return true;
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
}
|
||||||
|
|
||||||
export const progress = (inProgress) => (dispatch) => {
|
export const progress = (inProgress) => (dispatch) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: PROGRESS,
|
type: PROGRESS,
|
||||||
payload: inProgress,
|
payload: inProgress
|
||||||
});
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
export const resetTutorial = () => (dispatch, getState) => {
|
export const resetTutorial = () => (dispatch, getState) => {
|
||||||
dispatch(jsonString(""));
|
dispatch(jsonString(''));
|
||||||
dispatch(tutorialTitle(""));
|
dispatch(tutorialTitle(''));
|
||||||
|
dispatch(tutorialId(''));
|
||||||
var steps = [
|
var steps = [
|
||||||
{
|
{
|
||||||
type: "instruction",
|
id: 1,
|
||||||
headline: "",
|
type: 'instruction',
|
||||||
text: "",
|
headline: '',
|
||||||
|
text: '',
|
||||||
hardware: [],
|
hardware: [],
|
||||||
requirements: [],
|
requirements: []
|
||||||
},
|
}
|
||||||
];
|
];
|
||||||
dispatch(tutorialSteps(steps));
|
dispatch(tutorialSteps(steps));
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ERROR,
|
type: BUILDER_ERROR,
|
||||||
payload: {
|
payload: {
|
||||||
steps: [{}],
|
steps: [{}]
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -289,18 +268,16 @@ export const readJSON = (json) => (dispatch, getState) => {
|
|||||||
dispatch({
|
dispatch({
|
||||||
type: BUILDER_ERROR,
|
type: BUILDER_ERROR,
|
||||||
payload: {
|
payload: {
|
||||||
steps: json.steps.map(() => {
|
steps: json.steps.map(() => { return {}; })
|
||||||
return {};
|
}
|
||||||
}),
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
// accept only valid attributes
|
// accept only valid attributes
|
||||||
var steps = json.steps.map((step, i) => {
|
var steps = json.steps.map((step, i) => {
|
||||||
var object = {
|
var object = {
|
||||||
_id: step._id,
|
id: step.id,
|
||||||
type: step.type,
|
type: step.type,
|
||||||
headline: step.headline,
|
headline: step.headline,
|
||||||
text: step.text,
|
text: step.text
|
||||||
};
|
};
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
object.hardware = step.hardware;
|
object.hardware = step.hardware;
|
||||||
@@ -309,17 +286,19 @@ export const readJSON = (json) => (dispatch, getState) => {
|
|||||||
if (step.xml) {
|
if (step.xml) {
|
||||||
object.xml = step.xml;
|
object.xml = step.xml;
|
||||||
}
|
}
|
||||||
if (step.media && step.type === "instruction") {
|
if (step.media && step.type === 'instruction') {
|
||||||
object.media = {};
|
object.media = {};
|
||||||
if (step.media.picture) {
|
if (step.media.picture) {
|
||||||
object.media.picture = step.media.picture;
|
object.media.picture = step.media.picture;
|
||||||
} else if (step.media.youtube) {
|
}
|
||||||
|
else if (step.media.youtube) {
|
||||||
object.media.youtube = step.media.youtube;
|
object.media.youtube = step.media.youtube;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return object;
|
return object;
|
||||||
});
|
});
|
||||||
dispatch(tutorialTitle(json.title));
|
dispatch(tutorialTitle(json.title));
|
||||||
|
dispatch(tutorialId(json.id));
|
||||||
dispatch(tutorialSteps(steps));
|
dispatch(tutorialSteps(steps));
|
||||||
dispatch(setSubmitError());
|
dispatch(setSubmitError());
|
||||||
dispatch(progress(false));
|
dispatch(progress(false));
|
||||||
|
|||||||
@@ -1,61 +1,32 @@
|
|||||||
// authentication
|
export const NEW_CODE = 'NEW_CODE';
|
||||||
export const USER_LOADING = "USER_LOADING";
|
export const CHANGE_WORKSPACE = 'CHANGE_WORKSPACE';
|
||||||
export const USER_LOADED = "USER_LOADED";
|
export const CREATE_BLOCK = 'CREATE_BLOCK';
|
||||||
export const AUTH_ERROR = "AUTH_ERROR";
|
export const MOVE_BLOCK = 'MOVE_BLOCK';
|
||||||
export const LOGIN_SUCCESS = "LOGIN_SUCCESS";
|
export const CHANGE_BLOCK = 'CHANGE_BLOCK';
|
||||||
export const LOGIN_FAIL = "LOGIN_FAIL";
|
export const DELETE_BLOCK = 'DELETE_BLOCK';
|
||||||
export const LOGOUT_SUCCESS = "LOGOUT_SUCCESS";
|
export const CLEAR_STATS = 'CLEAR_STATS';
|
||||||
export const LOGOUT_FAIL = "LOGOUT_FAIL";
|
export const NAME = 'NAME';
|
||||||
export const REFRESH_TOKEN_FAIL = "REFRESH_TOKEN_FAIL";
|
|
||||||
export const REFRESH_TOKEN_SUCCESS = "REFRESH_TOKEN_SUCCESS";
|
|
||||||
|
|
||||||
export const NEW_CODE = "NEW_CODE";
|
|
||||||
export const CHANGE_WORKSPACE = "CHANGE_WORKSPACE";
|
|
||||||
export const CREATE_BLOCK = "CREATE_BLOCK";
|
|
||||||
export const MOVE_BLOCK = "MOVE_BLOCK";
|
|
||||||
export const CHANGE_BLOCK = "CHANGE_BLOCK";
|
|
||||||
export const DELETE_BLOCK = "DELETE_BLOCK";
|
|
||||||
export const CLEAR_STATS = "CLEAR_STATS";
|
|
||||||
export const NAME = "NAME";
|
|
||||||
|
|
||||||
export const TUTORIAL_PROGRESS = "TUTORIAL_PROGRESS";
|
export const TUTORIAL_SUCCESS = 'TUTORIAL_SUCCESS';
|
||||||
export const GET_TUTORIAL = "GET_TUTORIAL";
|
export const TUTORIAL_ERROR = 'TUTORIAL_ERROR';
|
||||||
export const GET_TUTORIALS = "GET_TUTORIALS";
|
export const TUTORIAL_CHANGE = 'TUTORIAL_CHANGE';
|
||||||
export const GET_STATUS = "GET_STATUS";
|
export const TUTORIAL_XML = 'TUTORIAL_XML';
|
||||||
export const TUTORIAL_SUCCESS = "TUTORIAL_SUCCESS";
|
export const TUTORIAL_ID = 'TUTORIAL_ID';
|
||||||
export const TUTORIAL_ERROR = "TUTORIAL_ERROR";
|
export const TUTORIAL_STEP = 'TUTORIAL_STEP';
|
||||||
export const TUTORIAL_CHANGE = "TUTORIAL_CHANGE";
|
export const JSON_STRING = 'JSON_STRING';
|
||||||
export const TUTORIAL_XML = "TUTORIAL_XML";
|
|
||||||
export const TUTORIAL_ID = "TUTORIAL_ID";
|
|
||||||
export const TUTORIAL_STEP = "TUTORIAL_STEP";
|
|
||||||
export const JSON_STRING = "JSON_STRING";
|
|
||||||
|
|
||||||
export const BUILDER_CHANGE = "BUILDER_CHANGE";
|
|
||||||
export const BUILDER_TITLE = "BUILDER_TITLE";
|
|
||||||
export const BUILDER_ID = "BUILDER_ID";
|
|
||||||
export const BUILDER_ADD_STEP = "BUILDER_ADD_STEP";
|
|
||||||
export const BUILDER_DELETE_STEP = "BUILDER_DELETE_STEP";
|
|
||||||
export const BUILDER_CHANGE_STEP = "BUILDER_CHANGE_STEP";
|
|
||||||
export const BUILDER_CHANGE_ORDER = "BUILDER_CHANGE_ORDER";
|
|
||||||
export const BUILDER_DELETE_PROPERTY = "BUILDER_DELETE_PROPERTY";
|
|
||||||
export const BUILDER_ERROR = "BUILDER_ERROR";
|
|
||||||
export const PROGRESS = "PROGRESS";
|
|
||||||
|
|
||||||
export const VISIT = "VISIT";
|
export const BUILDER_CHANGE = 'BUILDER_CHANGE';
|
||||||
export const LANGUAGE = "LANGUAGE";
|
export const BUILDER_TITLE = 'BUILDER_TITLE';
|
||||||
export const PLATFORM = "PLATFORM";
|
export const BUILDER_ID = 'BUILDER_ID';
|
||||||
export const RENDERER = "RENDERER";
|
export const BUILDER_ADD_STEP = 'BUILDER_ADD_STEP';
|
||||||
export const SOUNDS = "SOUNDS";
|
export const BUILDER_DELETE_STEP = 'BUILDER_DELETE_STEP';
|
||||||
export const STATISTICS = "STATISTICS";
|
export const BUILDER_CHANGE_STEP = 'BUILDER_CHANGE_STEP';
|
||||||
|
export const BUILDER_CHANGE_ORDER = 'BUILDER_CHANGE_ORDER';
|
||||||
|
export const BUILDER_DELETE_PROPERTY = 'BUILDER_DELETE_PROPERTY';
|
||||||
|
export const BUILDER_ERROR = 'BUILDER_ERROR';
|
||||||
|
export const PROGRESS = 'PROGRESS';
|
||||||
|
|
||||||
// messages
|
|
||||||
export const GET_ERRORS = "GET_ERRORS";
|
|
||||||
export const GET_SUCCESS = "GET_SUCCESS";
|
|
||||||
export const CLEAR_MESSAGES = "CLEAR_MESSAGES";
|
|
||||||
|
|
||||||
// projects: share, gallery, project
|
export const VISIT = 'VISIT';
|
||||||
export const PROJECT_PROGRESS = "PROJECT_PROGRESS";
|
|
||||||
export const GET_PROJECT = "GET_PROJECT";
|
|
||||||
export const GET_PROJECTS = "GET_PROJECTS";
|
|
||||||
export const PROJECT_TYPE = "PROJECT_TYPE";
|
|
||||||
export const PROJECT_DESCRIPTION = "PROJECT_DESCRIPTION";
|
|
||||||
|
|||||||
@@ -16,16 +16,6 @@ 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
|
|
||||||
if (selectedBlock !== null) {
|
|
||||||
code.helpurl = selectedBlock.helpUrl
|
|
||||||
code.tooltip = selectedBlock.tooltip
|
|
||||||
} else if (selectedBlock === null) {
|
|
||||||
code.tooltip = Blockly.Msg.tooltip_hint
|
|
||||||
code.helpurl = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
dispatch({
|
dispatch({
|
||||||
type: NEW_CODE,
|
type: NEW_CODE,
|
||||||
payload: code
|
payload: code
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
import React, { Component } from 'react';
|
|
||||||
|
|
||||||
import { withStyles } from '@material-ui/core/styles';
|
|
||||||
import { fade } from '@material-ui/core/styles/colorManipulator';
|
|
||||||
|
|
||||||
import Typography from '@material-ui/core/Typography';
|
|
||||||
|
|
||||||
const styles = (theme) => ({
|
|
||||||
alert: {
|
|
||||||
marginBottom: '20px',
|
|
||||||
border: `1px solid ${theme.palette.primary.main}`,
|
|
||||||
padding: '10px 20px',
|
|
||||||
borderRadius: '4px',
|
|
||||||
background: fade(theme.palette.primary.main, 0.3),
|
|
||||||
color: 'rgb(70,70,70)'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
export class Alert extends Component {
|
|
||||||
|
|
||||||
render(){
|
|
||||||
return(
|
|
||||||
<div className={this.props.classes.alert}>
|
|
||||||
<Typography>
|
|
||||||
{this.props.children}
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export default withStyles(styles, { withTheme: true })(Alert);
|
|
||||||
@@ -21,74 +21,57 @@
|
|||||||
* @author samelh@google.com (Sam El-Husseini)
|
* @author samelh@google.com (Sam El-Husseini)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from "react";
|
import React from 'react';
|
||||||
|
|
||||||
import Blockly from "blockly/core";
|
import Blockly from 'blockly/core';
|
||||||
import "blockly/blocks";
|
import locale from 'blockly/msg/en';
|
||||||
import Toolbox from "./toolbox/Toolbox";
|
import 'blockly/blocks';
|
||||||
|
import Toolbox from './toolbox/Toolbox';
|
||||||
|
|
||||||
import { Card } from "@material-ui/core";
|
import { Card } from '@material-ui/core';
|
||||||
import {
|
|
||||||
ScrollOptions,
|
|
||||||
ScrollBlockDragger,
|
Blockly.setLocale(locale);
|
||||||
ScrollMetricsManager,
|
|
||||||
} from "@blockly/plugin-scroll-options";
|
|
||||||
|
|
||||||
class BlocklyComponent extends React.Component {
|
class BlocklyComponent extends React.Component {
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.blocklyDiv = React.createRef();
|
|
||||||
this.toolbox = React.createRef();
|
|
||||||
this.state = { workspace: undefined };
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
constructor(props) {
|
||||||
const { initialXml, children, ...rest } = this.props;
|
super(props);
|
||||||
this.primaryWorkspace = Blockly.inject(this.blocklyDiv.current, {
|
this.blocklyDiv = React.createRef();
|
||||||
toolbox: this.toolbox.current,
|
this.toolbox = React.createRef();
|
||||||
plugins: {
|
this.state = {workspace: undefined};
|
||||||
// These are both required.
|
|
||||||
blockDragger: ScrollBlockDragger,
|
|
||||||
metricsManager: ScrollMetricsManager,
|
|
||||||
},
|
|
||||||
...rest,
|
|
||||||
});
|
|
||||||
// Initialize plugin.
|
|
||||||
|
|
||||||
this.setState({ workspace: this.primaryWorkspace });
|
|
||||||
const plugin = new ScrollOptions(this.workspace);
|
|
||||||
plugin.init({ enableWheelScroll: true, enableEdgeScroll: false });
|
|
||||||
if (initialXml) {
|
|
||||||
Blockly.Xml.domToWorkspace(
|
|
||||||
Blockly.Xml.textToDom(initialXml),
|
|
||||||
this.primaryWorkspace
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
get workspace() {
|
componentDidMount() {
|
||||||
return this.primaryWorkspace;
|
const { initialXml, children, ...rest } = this.props;
|
||||||
}
|
this.primaryWorkspace = Blockly.inject(
|
||||||
|
this.blocklyDiv.current,
|
||||||
|
{
|
||||||
|
toolbox: this.toolbox.current,
|
||||||
|
...rest
|
||||||
|
},
|
||||||
|
);
|
||||||
|
this.setState({workspace: this.primaryWorkspace})
|
||||||
|
|
||||||
setXml(xml) {
|
if (initialXml) {
|
||||||
Blockly.Xml.domToWorkspace(
|
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(initialXml), this.primaryWorkspace);
|
||||||
Blockly.Xml.textToDom(xml),
|
}
|
||||||
this.primaryWorkspace
|
}
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
get workspace() {
|
||||||
return (
|
return this.primaryWorkspace;
|
||||||
<React.Fragment>
|
}
|
||||||
<Card
|
|
||||||
ref={this.blocklyDiv}
|
setXml(xml) {
|
||||||
id="blocklyDiv"
|
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), this.primaryWorkspace);
|
||||||
style={this.props.style ? this.props.style : {}}
|
}
|
||||||
/>
|
|
||||||
<Toolbox toolbox={this.toolbox} workspace={this.state.workspace} />
|
render() {
|
||||||
</React.Fragment>
|
return <React.Fragment>
|
||||||
);
|
<Card ref={this.blocklyDiv} id="blocklyDiv" style={this.props.style ? this.props.style : {}}/>
|
||||||
}
|
<Toolbox toolbox={this.toolbox} workspace={this.state.workspace} />
|
||||||
|
</React.Fragment>;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default BlocklyComponent;
|
export default BlocklyComponent;
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ class BlocklySvg extends Component {
|
|||||||
var css = '<defs><style type="text/css" xmlns="http://www.w3.org/1999/xhtml"><![CDATA[' + cssContent + ']]></style></defs>';
|
var css = '<defs><style type="text/css" xmlns="http://www.w3.org/1999/xhtml"><![CDATA[' + cssContent + ']]></style></defs>';
|
||||||
var bbox = document.getElementsByClassName("blocklyBlockCanvas")[0].getBBox();
|
var bbox = document.getElementsByClassName("blocklyBlockCanvas")[0].getBBox();
|
||||||
var content = new XMLSerializer().serializeToString(canvas);
|
var content = new XMLSerializer().serializeToString(canvas);
|
||||||
|
|
||||||
var xml = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
var xml = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
width="${bbox.width}" height="${bbox.height}" viewBox="${bbox.x} ${bbox.y} ${bbox.width} ${bbox.height}">
|
width="${bbox.width}" height="${bbox.height}" viewBox="${bbox.x} ${bbox.y} ${bbox.width} ${bbox.height}">
|
||||||
${css}">${content}</svg>`;
|
${css}">${content}</svg>`;
|
||||||
@@ -64,7 +65,7 @@ class BlocklySvg extends Component {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{display: 'inline-flex', justifyContent: 'center', transform: 'scale(0.8) translate(0, calc(100% * -0.2 / 2))'}}
|
style={{display: 'flex', justifyContent: 'center', transform: 'scale(0.8) translate(0, calc(100% * -0.2 / 2))'}}
|
||||||
dangerouslySetInnerHTML={{ __html: this.state.svg }}
|
dangerouslySetInnerHTML={{ __html: this.state.svg }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
import React, { Component } from "react";
|
import React, { Component } from 'react';
|
||||||
import PropTypes from "prop-types";
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from "react-redux";
|
import { connect } from 'react-redux';
|
||||||
import { onChangeWorkspace, clearStats } from "../../actions/workspaceActions";
|
import { onChangeWorkspace, clearStats } from '../../actions/workspaceActions';
|
||||||
|
// import * as De from 'blockly/msg/de';
|
||||||
|
import {De} from './msg/de';
|
||||||
|
import BlocklyComponent from './BlocklyComponent';
|
||||||
|
import BlocklySvg from './BlocklySvg';
|
||||||
|
import * as Blockly from 'blockly/core';
|
||||||
|
import './blocks/index';
|
||||||
|
import './generator/index';
|
||||||
|
import { initialXml } from './initialXml.js';
|
||||||
|
|
||||||
import BlocklyComponent from "./BlocklyComponent";
|
|
||||||
import BlocklySvg from "./BlocklySvg";
|
|
||||||
|
|
||||||
import * as Blockly from "blockly/core";
|
|
||||||
import "./blocks/index";
|
|
||||||
import "./generator/index";
|
|
||||||
import { ZoomToFitControl } from "@blockly/zoom-to-fit";
|
|
||||||
import { initialXml } from "./initialXml.js";
|
|
||||||
import { getMaxInstances } from "./helpers/maxInstances";
|
|
||||||
|
|
||||||
class BlocklyWindow extends Component {
|
class BlocklyWindow extends Component {
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.simpleWorkspace = React.createRef();
|
this.simpleWorkspace = React.createRef();
|
||||||
|
Blockly.setLocale(De);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
@@ -25,7 +27,6 @@ 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,13 +34,10 @@ class BlocklyWindow extends Component {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
Blockly.svgResize(workspace);
|
Blockly.svgResize(workspace);
|
||||||
const zoomToFit = new ZoomToFitControl(workspace);
|
|
||||||
zoomToFit.init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(props) {
|
componentDidUpdate(props) {
|
||||||
const workspace = Blockly.getMainWorkspace();
|
const workspace = Blockly.getMainWorkspace();
|
||||||
|
|
||||||
var xml = this.props.initialXml;
|
var xml = this.props.initialXml;
|
||||||
// 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) {
|
||||||
@@ -48,92 +46,52 @@ class BlocklyWindow extends Component {
|
|||||||
if (!xml) xml = initialXml;
|
if (!xml) xml = initialXml;
|
||||||
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace);
|
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace);
|
||||||
}
|
}
|
||||||
if (props.language !== this.props.language) {
|
|
||||||
// change language
|
|
||||||
if (!xml) xml = initialXml;
|
|
||||||
var xmlDom = Blockly.Xml.textToDom(xml);
|
|
||||||
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);
|
|
||||||
// var toolbox = workspace.getToolbox();
|
|
||||||
// workspace.updateToolbox(toolbox.toolboxDef_);
|
|
||||||
}
|
|
||||||
Blockly.svgResize(workspace);
|
Blockly.svgResize(workspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<BlocklyComponent
|
<BlocklyComponent ref={this.simpleWorkspace}
|
||||||
ref={this.simpleWorkspace}
|
|
||||||
style={this.props.svg ? { height: 0 } : this.props.blocklyCSS}
|
style={this.props.svg ? { height: 0 } : this.props.blocklyCSS}
|
||||||
readOnly={
|
readOnly={this.props.readOnly !== undefined ? this.props.readOnly : false}
|
||||||
this.props.readOnly !== undefined ? this.props.readOnly : false
|
trashcan={this.props.trashcan !== undefined ? this.props.trashcan : true}
|
||||||
}
|
renderer='geras'
|
||||||
trashcan={
|
zoom={{ // https://developers.google.com/blockly/guides/configure/web/zoom
|
||||||
this.props.trashcan !== undefined ? this.props.trashcan : true
|
controls: this.props.zoomControls !== undefined ? this.props.zoomControls : true,
|
||||||
}
|
|
||||||
renderer={this.props.renderer}
|
|
||||||
sounds={this.props.sounds}
|
|
||||||
maxInstances={getMaxInstances()}
|
|
||||||
zoom={{
|
|
||||||
// https://developers.google.com/blockly/guides/configure/web/zoom
|
|
||||||
controls:
|
|
||||||
this.props.zoomControls !== undefined
|
|
||||||
? this.props.zoomControls
|
|
||||||
: true,
|
|
||||||
wheel: false,
|
wheel: false,
|
||||||
startScale: 1,
|
startScale: 1,
|
||||||
maxScale: 3,
|
maxScale: 3,
|
||||||
minScale: 0.3,
|
minScale: 0.3,
|
||||||
scaleSpeed: 1.2,
|
scaleSpeed: 1.2
|
||||||
}}
|
}}
|
||||||
grid={
|
grid={this.props.grid !== undefined && !this.props.grid ? {} :
|
||||||
this.props.grid !== undefined && !this.props.grid
|
{ // https://developers.google.com/blockly/guides/configure/web/grid
|
||||||
? {}
|
spacing: 20,
|
||||||
: {
|
length: 1,
|
||||||
// https://developers.google.com/blockly/guides/configure/web/grid
|
colour: '#4EAF47', // senseBox-green
|
||||||
spacing: 20,
|
snap: false
|
||||||
length: 1,
|
}}
|
||||||
colour: "#4EAF47", // senseBox-green
|
media={'/media/blockly/'}
|
||||||
snap: false,
|
move={this.props.move !== undefined && !this.props.move ? {} :
|
||||||
}
|
{ // https://developers.google.com/blockly/guides/configure/web/move
|
||||||
}
|
scrollbars: true,
|
||||||
media={"/media/blockly/"}
|
drag: true,
|
||||||
move={
|
wheel: false
|
||||||
this.props.move !== undefined && !this.props.move
|
}}
|
||||||
? {}
|
initialXml={this.props.initialXml ? this.props.initialXml : initialXml}
|
||||||
: {
|
>
|
||||||
// https://developers.google.com/blockly/guides/configure/web/move
|
</BlocklyComponent >
|
||||||
scrollbars: true,
|
{this.props.svg && this.props.initialXml ? <BlocklySvg initialXml={this.props.initialXml} /> : null}
|
||||||
drag: true,
|
|
||||||
wheel: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
initialXml={
|
|
||||||
this.props.initialXml ? this.props.initialXml : initialXml
|
|
||||||
}
|
|
||||||
></BlocklyComponent>
|
|
||||||
{this.props.svg && this.props.initialXml ? (
|
|
||||||
<BlocklySvg initialXml={this.props.initialXml} />
|
|
||||||
) : null}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
BlocklyWindow.propTypes = {
|
BlocklyWindow.propTypes = {
|
||||||
onChangeWorkspace: PropTypes.func.isRequired,
|
onChangeWorkspace: PropTypes.func.isRequired,
|
||||||
clearStats: PropTypes.func.isRequired,
|
clearStats: PropTypes.func.isRequired
|
||||||
renderer: PropTypes.string.isRequired,
|
|
||||||
sounds: PropTypes.string.isRequired,
|
|
||||||
language: PropTypes.string.isRequired,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapStateToProps = (state) => ({
|
|
||||||
renderer: state.general.renderer,
|
|
||||||
sounds: state.general.sounds,
|
|
||||||
language: state.general.language,
|
|
||||||
});
|
|
||||||
|
|
||||||
export default connect(mapStateToProps, { onChangeWorkspace, clearStats })(
|
export default connect(null, { onChangeWorkspace, clearStats })(BlocklyWindow);
|
||||||
BlocklyWindow
|
|
||||||
);
|
|
||||||
|
|||||||
@@ -1,28 +1,21 @@
|
|||||||
import "./loops";
|
import './loops';
|
||||||
import "./sensebox";
|
import './sensebox';
|
||||||
import "./logic";
|
import './logic';
|
||||||
import "./sensebox-sensors";
|
import './sensebox-sensors';
|
||||||
import "./sensebox-telegram";
|
import './sensebox-telegram';
|
||||||
import "./sensebox-osem";
|
import './sensebox-osem';
|
||||||
import "./sensebox-web";
|
import './sensebox-web';
|
||||||
import "./sensebox-display";
|
import './sensebox-display';
|
||||||
import "./sensebox-lora";
|
import './sensebox-lora';
|
||||||
import "./sensebox-led";
|
import './sensebox-led';
|
||||||
import "./sensebox-rtc";
|
import './sensebox-sd';
|
||||||
import "./sensebox-ble";
|
import './text';
|
||||||
import "./sensebox-sd";
|
import './io';
|
||||||
import "./mqtt";
|
import './audio';
|
||||||
import "./text";
|
import './math';
|
||||||
import "./io";
|
import './map';
|
||||||
import "./audio";
|
import './procedures';
|
||||||
import "./math";
|
import './time';
|
||||||
import "./map";
|
import './variables';
|
||||||
import "./procedures";
|
|
||||||
import "./serial";
|
|
||||||
import "./time";
|
|
||||||
import "./variables";
|
|
||||||
import "./lists";
|
|
||||||
import "./watchdog";
|
|
||||||
import "./webserver";
|
|
||||||
|
|
||||||
import "../helpers/types";
|
import '../helpers/types'
|
||||||
@@ -10,271 +10,248 @@
|
|||||||
*
|
*
|
||||||
* 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.
|
/**
|
||||||
* @this Blockly.Block
|
* Block for creating a 'set pin' to a state.
|
||||||
*/
|
* @this Blockly.Block
|
||||||
init: function () {
|
*/
|
||||||
this.setHelpUrl("http://arduino.cc/en/Reference/DigitalWrite");
|
init: function () {
|
||||||
this.setColour(250);
|
this.setHelpUrl('http://arduino.cc/en/Reference/DigitalWrite');
|
||||||
this.appendValueInput("STATE")
|
this.setColour(250);
|
||||||
.appendField(Blockly.Msg.ARD_DIGITALWRITE)
|
this.appendValueInput('STATE')
|
||||||
.appendField(
|
.appendField(Blockly.Msg.ARD_DIGITALWRITE)
|
||||||
new Blockly.FieldDropdown(selectedBoard().digitalPins),
|
.appendField(new Blockly.FieldDropdown(
|
||||||
"PIN"
|
selectedBoard().digitalPins), 'PIN')
|
||||||
)
|
.appendField(Blockly.Msg.ARD_WRITE_TO)
|
||||||
.appendField(Blockly.Msg.ARD_WRITE_TO)
|
.setCheck(Types.BOOLEAN.checkList);
|
||||||
.setCheck(Types.BOOLEAN.checkList);
|
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_DIGITALWRITE_TIP);
|
||||||
this.setTooltip(Blockly.Msg.ARD_DIGITALWRITE_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(
|
||||||
Blockly.Arduino.Boards.refreshBlockFieldDropdown(
|
this, 'PIN', 'digitalPins');
|
||||||
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(
|
.appendField(new Blockly.FieldDropdown(
|
||||||
new Blockly.FieldDropdown(selectedBoard().digitalPins),
|
selectedBoard().digitalPins), 'PIN');
|
||||||
"PIN"
|
this.setOutput(true, 'boolean');
|
||||||
);
|
this.setTooltip(Blockly.Msg.ARD_DIGITALREAD_TIP);
|
||||||
this.setOutput(true, "boolean");
|
},
|
||||||
this.setTooltip(Blockly.Msg.ARD_DIGITALREAD_TIP);
|
/** @return {!string} The type of return value for the block, an integer. */
|
||||||
},
|
getBlockType: function () {
|
||||||
/** @return {!string} The type of return value for the block, an integer. */
|
return Types.BOOLEAN;
|
||||||
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.
|
*/
|
||||||
* @this Blockly.Block
|
updateFields: function () {
|
||||||
*/
|
Blockly.Arduino.Boards.refreshBlockFieldDropdown(
|
||||||
updateFields: function () {
|
this, 'PIN', 'digitalPins');
|
||||||
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(
|
.appendField(new Blockly.FieldDropdown(
|
||||||
new Blockly.FieldDropdown(selectedBoard().builtinLed),
|
selectedBoard().builtinLed), 'BUILT_IN_LED')
|
||||||
"BUILT_IN_LED"
|
.appendField(Blockly.Msg.ARD_WRITE_TO)
|
||||||
)
|
.setCheck(Types.BOOLEAN.compatibleTypes);
|
||||||
.appendField(Blockly.Msg.ARD_WRITE_TO)
|
this.setInputsInline(false);
|
||||||
.setCheck(Types.BOOLEAN.compatibleTypes);
|
this.setPreviousStatement(true, null);
|
||||||
this.setInputsInline(false);
|
this.setNextStatement(true, null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setTooltip(Blockly.Msg.ARD_BUILTIN_LED_TIP);
|
||||||
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.
|
*/
|
||||||
* @this Blockly.Block
|
updateFields: function () {
|
||||||
*/
|
Blockly.Arduino.Boards.refreshBlockFieldDropdown(
|
||||||
updateFields: function () {
|
this, 'BUILT_IN_LED', 'builtinLed');
|
||||||
Blockly.Arduino.Boards.refreshBlockFieldDropdown(
|
},
|
||||||
this,
|
/** @return {!string} The type of input value for the block, an integer. */
|
||||||
"BUILT_IN_LED",
|
getBlockType: function () {
|
||||||
"builtinLed"
|
return Types.BOOLEAN;
|
||||||
);
|
},
|
||||||
},
|
|
||||||
/** @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(selectedBoard().pwmPins), "PIN")
|
.appendField(new Blockly.FieldDropdown(
|
||||||
.appendField(Blockly.Msg.ARD_WRITE_TO)
|
selectedBoard().pwmPins), 'PIN')
|
||||||
.setCheck(Types.NUMBER.compatibleTypes);
|
.appendField(Blockly.Msg.ARD_WRITE_TO)
|
||||||
this.setInputsInline(false);
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
this.setPreviousStatement(true, null);
|
this.setInputsInline(false);
|
||||||
this.setNextStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setTooltip(Blockly.Msg.ARD_ANALOGWRITE_TIP);
|
this.setNextStatement(true, null);
|
||||||
},
|
this.setTooltip(Blockly.Msg.ARD_ANALOGWRITE_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(this, "PIN", "pwmPins");
|
updateFields: function () {
|
||||||
},
|
Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, 'PIN', 'pwmPins');
|
||||||
/** @return {!string} The type of input value for the block, an integer. */
|
},
|
||||||
getBlockType: function () {
|
/** @return {!string} The type of input value for the block, an integer. */
|
||||||
return Types.NUMBER;
|
getBlockType: function () {
|
||||||
},
|
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(
|
.appendField(new Blockly.FieldDropdown(
|
||||||
new Blockly.FieldDropdown(selectedBoard().analogPins),
|
selectedBoard().analogPins), 'PIN');
|
||||||
"PIN"
|
this.setOutput(true, Types.NUMBER.typeId);
|
||||||
);
|
this.setTooltip(Blockly.Msg.ARD_ANALOGREAD_TIP);
|
||||||
this.setOutput(true, Types.NUMBER.typeName);
|
},
|
||||||
this.setTooltip(Blockly.Msg.ARD_ANALOGREAD_TIP);
|
/** @return {!string} The type of return value for the block, an integer. */
|
||||||
},
|
getBlockType: function () {
|
||||||
/** @return {!string} The type of return value for the block, an integer. */
|
return Types.NUMBER.typeId;
|
||||||
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.
|
*/
|
||||||
* @this Blockly.Block
|
updateFields: function () {
|
||||||
*/
|
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().appendField(
|
this.appendDummyInput()
|
||||||
new Blockly.FieldDropdown([
|
.appendField(
|
||||||
[Blockly.Msg.ARD_HIGH, "HIGH"],
|
new Blockly.FieldDropdown([[Blockly.Msg.ARD_HIGH, 'HIGH'], [Blockly.Msg.ARD_LOW, 'LOW']]),
|
||||||
[Blockly.Msg.ARD_LOW, "LOW"],
|
'STATE');
|
||||||
]),
|
this.setOutput(true, Types.BOOLEAN.typeId);
|
||||||
"STATE"
|
this.setTooltip(Blockly.Msg.ARD_HIGHLOW_TIP);
|
||||||
);
|
},
|
||||||
this.setOutput(true, Types.BOOLEAN.typeName);
|
/** @return {!string} The type of return value for the block, an integer. */
|
||||||
this.setTooltip(Blockly.Msg.ARD_HIGHLOW_TIP);
|
getBlockType: function () {
|
||||||
},
|
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",
|
||||||
type: "input_value",
|
"name": "PULSETYPE",
|
||||||
name: "PULSETYPE",
|
"check": Types.BOOLEAN.compatibleTypes
|
||||||
check: Types.BOOLEAN.compatibleTypes,
|
}, {
|
||||||
},
|
"type": "field_dropdown",
|
||||||
{
|
"name": "PULSEPIN",
|
||||||
type: "field_dropdown",
|
"options": selectedBoard().digitalPins,
|
||||||
name: "PULSEPIN",
|
}
|
||||||
options: selectedBoard().digitalPins,
|
],
|
||||||
},
|
"output": Types.NUMBER.typeId,
|
||||||
],
|
"inputsInline": true,
|
||||||
output: Types.NUMBER.typeName,
|
"colour": 250,
|
||||||
inputsInline: true,
|
"tooltip": Blockly.Msg.ARD_PULSE_TIP,
|
||||||
colour: 250,
|
"helpUrl": 'https://www.arduino.cc/en/Reference/PulseIn'
|
||||||
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 {!string} The type of input value for the block, an integer. */
|
return Types.NUMBER.typeId;
|
||||||
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",
|
||||||
type: "input_value",
|
"name": "PULSETYPE",
|
||||||
name: "PULSETYPE",
|
"check": Types.BOOLEAN.compatibleTypes
|
||||||
check: Types.BOOLEAN.compatibleTypes,
|
}, {
|
||||||
},
|
"type": "field_dropdown",
|
||||||
{
|
"name": "PULSEPIN",
|
||||||
type: "field_dropdown",
|
"options": selectedBoard().digitalPins,
|
||||||
name: "PULSEPIN",
|
}, {
|
||||||
options: selectedBoard().digitalPins,
|
"type": "input_value",
|
||||||
},
|
"name": "TIMEOUT",
|
||||||
{
|
"check": Types.NUMBER.compatibleTypes
|
||||||
type: "input_value",
|
}
|
||||||
name: "TIMEOUT",
|
],
|
||||||
check: Types.NUMBER.compatibleTypes,
|
"output": Types.NUMBER.typeId,
|
||||||
},
|
"inputsInline": true,
|
||||||
],
|
"colour": 250,
|
||||||
output: Types.NUMBER.typeName,
|
"tooltip": Blockly.Msg.ARD_PULSETIMEOUT_TIP,
|
||||||
inputsInline: true,
|
"helpUrl": 'https://www.arduino.cc/en/Reference/PulseIn'
|
||||||
colour: 250,
|
});
|
||||||
tooltip: Blockly.Msg.ARD_PULSETIMEOUT_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;
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
import Blockly, { FieldDropdown } from "blockly/core";
|
|
||||||
import * as Types from "../helpers/types";
|
|
||||||
import { getColour } from "../helpers/colour";
|
|
||||||
|
|
||||||
Blockly.Blocks["lists_create_empty"] = {
|
|
||||||
/**
|
|
||||||
* Elapsed time in milliseconds block definition
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
|
|
||||||
this.setColour(getColour().arrays);
|
|
||||||
this.appendDummyInput().appendField("create List with");
|
|
||||||
this.appendValueInput("NUMBER");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField("Items of Type")
|
|
||||||
.appendField(new FieldDropdown(Types.VARIABLE_TYPES), "type");
|
|
||||||
this.setOutput(true, Types.ARRAY.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["array_getIndex"] = {
|
|
||||||
/**
|
|
||||||
* Elapsed time in milliseconds block definition
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
|
|
||||||
this.setColour(getColour().arrays);
|
|
||||||
this.appendDummyInput().appendField(
|
|
||||||
new Blockly.FieldVariable("X", null, ["Array"], "Array"),
|
|
||||||
"FIELDNAME"
|
|
||||||
);
|
|
||||||
this.setOutput(true, Types.ARRAY.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["lists_length"] = {
|
|
||||||
/**
|
|
||||||
* Elapsed time in milliseconds block definition
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl("http://arduino.cc/en/Reference/Millis");
|
|
||||||
this.setColour(getColour().arrays);
|
|
||||||
this.appendValueInput("ARRAY")
|
|
||||||
.appendField("length of")
|
|
||||||
.setCheck(Types.ARRAY.compatibleTypes);
|
|
||||||
this.setOutput(true, Types.NUMBER.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
import Blockly from 'blockly';
|
import Blockly from 'blockly';
|
||||||
import { getColour } from '../helpers/colour';
|
import { getColour } from '../helpers/colour';
|
||||||
import { getCompatibleTypes } from '../helpers/types'
|
import { getCompatibleTypes } from '../helpers/types'
|
||||||
import * as Types from '../helpers/types';
|
|
||||||
|
|
||||||
Blockly.Blocks['controls_whileUntil'] = {
|
Blockly.Blocks['controls_whileUntil'] = {
|
||||||
/**
|
/**
|
||||||
@@ -16,7 +16,7 @@ Blockly.Blocks['controls_whileUntil'] = {
|
|||||||
this.setHelpUrl(Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL);
|
this.setHelpUrl(Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL);
|
||||||
this.setColour(getColour().loops);
|
this.setColour(getColour().loops);
|
||||||
this.appendValueInput('BOOL')
|
this.appendValueInput('BOOL')
|
||||||
.setCheck(getCompatibleTypes('boolean'))
|
.setCheck(getCompatibleTypes(Boolean))
|
||||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'MODE');
|
.appendField(new Blockly.FieldDropdown(OPERATORS), 'MODE');
|
||||||
this.appendStatementInput('DO')
|
this.appendStatementInput('DO')
|
||||||
.appendField(Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO);
|
.appendField(Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO);
|
||||||
@@ -47,25 +47,24 @@ Blockly.Blocks['controls_for'] = {
|
|||||||
{
|
{
|
||||||
"type": "field_variable",
|
"type": "field_variable",
|
||||||
"name": "VAR",
|
"name": "VAR",
|
||||||
"defaultType": Types.NUMBER.typeName,
|
|
||||||
"variable": null
|
"variable": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "input_value",
|
"type": "input_value",
|
||||||
"name": "FROM",
|
"name": "FROM",
|
||||||
"check": getCompatibleTypes('int'),
|
"check": getCompatibleTypes(Number),
|
||||||
"align": "RIGHT"
|
"align": "RIGHT"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "input_value",
|
"type": "input_value",
|
||||||
"name": "TO",
|
"name": "TO",
|
||||||
"check": getCompatibleTypes('int'),
|
"check": getCompatibleTypes(Number),
|
||||||
"align": "RIGHT"
|
"align": "RIGHT"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "input_value",
|
"type": "input_value",
|
||||||
"name": "BY",
|
"name": "BY",
|
||||||
"check": getCompatibleTypes('int'),
|
"check": getCompatibleTypes(Number),
|
||||||
"align": "RIGHT"
|
"align": "RIGHT"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -98,13 +97,12 @@ Blockly.Blocks['controls_forEach'] = {
|
|||||||
{
|
{
|
||||||
"type": "field_variable",
|
"type": "field_variable",
|
||||||
"name": "VAR",
|
"name": "VAR",
|
||||||
"defaultType": Types.NUMBER.typeName,
|
|
||||||
"variable": null
|
"variable": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "input_value",
|
"type": "input_value",
|
||||||
"name": "LIST",
|
"name": "LIST",
|
||||||
"check": getCompatibleTypes('Array')
|
"check": getCompatibleTypes(Array)
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"previousStatement": null,
|
"previousStatement": null,
|
||||||
@@ -197,7 +195,7 @@ Blockly.Blocks['controls_repeat_ext'] = {
|
|||||||
{
|
{
|
||||||
"type": "input_value",
|
"type": "input_value",
|
||||||
"name": "TIMES",
|
"name": "TIMES",
|
||||||
"check": getCompatibleTypes('int'),
|
"check": getCompatibleTypes(Number),
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"previousStatement": null,
|
"previousStatement": null,
|
||||||
|
|||||||
@@ -11,39 +11,40 @@
|
|||||||
* 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";
|
|
||||||
|
|
||||||
Blockly.Blocks["base_map"] = {
|
import * as Blockly from 'blockly/core';
|
||||||
/**
|
import { getColour } from '../helpers/colour';
|
||||||
* Block for creating a the map function.
|
import * as Types from '../helpers/types'
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
Blockly.Blocks['base_map'] = {
|
||||||
init: function () {
|
/**
|
||||||
this.setHelpUrl("http://arduino.cc/en/Reference/map");
|
* Block for creating a the map function.
|
||||||
this.setColour(getColour().math);
|
* @this Blockly.Block
|
||||||
this.appendValueInput("NUM")
|
*/
|
||||||
.appendField(Blockly.Msg.ARD_MAP)
|
init: function () {
|
||||||
.setCheck(Types.NUMBER.compatibleTypes);
|
this.setHelpUrl('http://arduino.cc/en/Reference/map');
|
||||||
this.appendValueInput("FMIN")
|
this.setColour(getColour().math);
|
||||||
.appendField(Blockly.Msg.ARD_MAP_FROMMIN)
|
this.appendValueInput('NUM')
|
||||||
.setCheck(Types.NUMBER.compatibleTypes);
|
.appendField(Blockly.Msg.ARD_MAP)
|
||||||
this.appendValueInput("FMAX")
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
.appendField(Blockly.Msg.ARD_MAP_FROMMAX)
|
this.appendValueInput('FMIN')
|
||||||
.setCheck(Types.NUMBER.compatibleTypes);
|
.appendField(Blockly.Msg.ARD_MAP_FROMMIN)
|
||||||
this.appendValueInput("DMIN")
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
.appendField(Blockly.Msg.ARD_MAP_TOMIN)
|
this.appendValueInput('FMAX')
|
||||||
.setCheck(Types.NUMBER.compatibleTypes);
|
.appendField(Blockly.Msg.ARD_MAP_FROMMAX)
|
||||||
this.appendValueInput("DMAX")
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
.appendField(Blockly.Msg.ARD_MAP_TOMAX)
|
this.appendValueInput('DMIN')
|
||||||
.setCheck(Types.NUMBER.compatibleTypes);
|
.appendField(Blockly.Msg.ARD_MAP_TOMIN)
|
||||||
this.setOutput(true);
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
this.setInputsInline(false);
|
this.appendValueInput('DMAX')
|
||||||
this.setTooltip(Blockly.Msg.ARD_MAP_TIP);
|
.appendField(Blockly.Msg.ARD_MAP_TOMAX)
|
||||||
},
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
/** @return {string} The type of return value for the block, an integer. */
|
this.setOutput(true);
|
||||||
getBlockType: function () {
|
this.setInputsInline(false);
|
||||||
return Types.NUMBER.typeName;
|
this.setTooltip(Blockly.Msg.ARD_MAP_TIP);
|
||||||
},
|
},
|
||||||
|
/** @return {string} The type of return value for the block, an integer. */
|
||||||
|
getBlockType: function () {
|
||||||
|
return Types.NUMBER.typeId;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -287,8 +287,7 @@ Blockly.Blocks['math_change'] = {
|
|||||||
{
|
{
|
||||||
"type": "field_variable",
|
"type": "field_variable",
|
||||||
"name": "VAR",
|
"name": "VAR",
|
||||||
"defaultType": Types.NUMBER.typeName,
|
"variable": Blockly.Msg.MATH_CHANGE_TITLE_ITEM
|
||||||
"variable": null
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "input_value",
|
"type": "input_value",
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
import * as Blockly from 'blockly/core';
|
|
||||||
import { getColour } from '../helpers/colour';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MQTT Blocks
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_mqtt_setup"] = {
|
|
||||||
init: function () {
|
|
||||||
|
|
||||||
//this.setTooltip(Blockly.Msg.senseBox_wifi_);
|
|
||||||
this.setHelpUrl('');
|
|
||||||
this.setColour(getColour().mqtt);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_mqtt_init)
|
|
||||||
.appendField(new Blockly.FieldDropdown([["Adafruit IO", 'adafruitio'], ["DIOTY", 'dioty'], ["Other Service", 'custom']]), "service");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_mqtt_server)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Server"), "server");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_mqtt_port)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Port"), "port");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_mqtt_username)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Username"), "username");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_mqtt_password, "passwordmsg")
|
|
||||||
.appendField(new Blockly.FieldTextInput("Password"), "password");
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_mqtt_init_tooltip);
|
|
||||||
},
|
|
||||||
onchange: function (e) {
|
|
||||||
let service = this.getFieldValue('service');
|
|
||||||
switch (service) {
|
|
||||||
case 'adafruitio':
|
|
||||||
this.getField('server').setValue("io.adafruit.com");
|
|
||||||
this.getField('port').setValue("1883");
|
|
||||||
this.getField('passwordmsg').setValue("Adafruit IO Key");
|
|
||||||
break;
|
|
||||||
case 'dioty':
|
|
||||||
this.getField('server').setValue("mqtt.dioty.co");
|
|
||||||
this.getField('port').setValue("1883");
|
|
||||||
this.getField('passwordmsg').setValue(Blockly.Msg.senseBox_mqtt_password);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "custom":
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_mqtt_publish"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().mqtt);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_mqtt_publish);
|
|
||||||
this.appendValueInput('value')
|
|
||||||
.setCheck(null)
|
|
||||||
.appendField('Feed/Topic')
|
|
||||||
.appendField(new Blockly.FieldTextInput('Name'), 'publishfeed');
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_mqtt_publish_tooltip);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_mqtt_subscribe"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().mqtt);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_mqtt_subscribe);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(new Blockly.FieldTextInput('Feedname'), 'subscribefeed');
|
|
||||||
this.setOutput(true, null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
import * as Blockly from "blockly";
|
|
||||||
import { getColour } from "../helpers/colour";
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_init"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_init)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Geräte Name"), "devicename");
|
|
||||||
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_init_tooltip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_experiment"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.appendDummyInput().appendField(
|
|
||||||
Blockly.Msg.sensebox_phyphox_createExperiment
|
|
||||||
);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_experimentTitle)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Experiment Title"), "title");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_experimentDescription)
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldTextInput(
|
|
||||||
Blockly.Msg.sensebox_phyphox_experiment_description
|
|
||||||
),
|
|
||||||
"description"
|
|
||||||
);
|
|
||||||
this.appendStatementInput("view").appendField(
|
|
||||||
Blockly.Msg.sensebox_phyphox_createView
|
|
||||||
);
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_graph"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_createGraph)
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_graphLabel)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Label"), "label");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_unitx)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Unit X"), "unitx");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_unity)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Unit Y"), "unity");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_labelx)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Label X"), "labelx");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_labely)
|
|
||||||
.appendField(new Blockly.FieldTextInput("Label Y"), "labely");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_graphStyle)
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
[Blockly.Msg.sensebox_phyphox_style_line, "line"],
|
|
||||||
[Blockly.Msg.sensebox_phyphox_style_dots, "dots"],
|
|
||||||
]),
|
|
||||||
"style"
|
|
||||||
);
|
|
||||||
this.appendValueInput("channel0").appendField(
|
|
||||||
Blockly.Msg.sensebox_phyphox_channel0
|
|
||||||
);
|
|
||||||
this.appendValueInput("channel1").appendField(
|
|
||||||
Blockly.Msg.sensebox_phyphox_channel1
|
|
||||||
);
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_graph_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_timestamp"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.sensebox_phyphox_timestamp);
|
|
||||||
this.setOutput(true);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_timestamp_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_channel"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_channel)
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
["1", "1"],
|
|
||||||
["2", "2"],
|
|
||||||
["3", "3"],
|
|
||||||
["4", "4"],
|
|
||||||
["5", "5"],
|
|
||||||
]),
|
|
||||||
"channel"
|
|
||||||
);
|
|
||||||
|
|
||||||
this.setOutput(true);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_channel_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_sendchannel"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.appendValueInput("value")
|
|
||||||
.appendField(Blockly.Msg.sensebox_phyphox_sendchannel)
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
["1", "1"],
|
|
||||||
["2", "2"],
|
|
||||||
["3", "3"],
|
|
||||||
["4", "4"],
|
|
||||||
["5", "5"],
|
|
||||||
]),
|
|
||||||
"channel"
|
|
||||||
);
|
|
||||||
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_sendchannel_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_phyphox_experiment_send"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().phyphox);
|
|
||||||
this.appendStatementInput("sendValues").appendField(
|
|
||||||
Blockly.Msg.sensebox_phyphox_writeValues
|
|
||||||
);
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_phyphox_experiment_send_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_phyphox_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,329 +1,254 @@
|
|||||||
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"] = {
|
|
||||||
init: function () {
|
Blockly.Blocks['sensebox_display_beginDisplay'] = {
|
||||||
this.appendDummyInput().appendField(
|
init: function () {
|
||||||
Blockly.Msg.senseBox_display_beginDisplay
|
this.appendDummyInput()
|
||||||
);
|
.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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_display_clearDisplay"] = {
|
Blockly.Blocks['sensebox_display_clearDisplay'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.appendDummyInput().appendField(
|
this.appendDummyInput()
|
||||||
Blockly.Msg.senseBox_display_clearDisplay
|
.appendField(Blockly.Msg.senseBox_display_clearDisplay)
|
||||||
);
|
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_clearDisplay_tip);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_display_clearDisplay_tooltip);
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
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().appendField(
|
this.appendDummyInput()
|
||||||
Blockly.Msg.senseBox_display_printDisplay
|
.appendField(Blockly.Msg.senseBox_display_printDisplay);
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_display_color)
|
||||||
.appendField(Blockly.Msg.senseBox_display_color)
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_display_white, "WHITE,BLACK"], [Blockly.Msg.senseBox_display_black, "BLACK,WHITE"]]), "COLOR");
|
||||||
.appendField(
|
this.appendDummyInput()
|
||||||
new Blockly.FieldDropdown([
|
.appendField(Blockly.Msg.senseBox_display_setSize)
|
||||||
[Blockly.Msg.senseBox_display_white, "WHITE,BLACK"],
|
.appendField(new FieldSlider(1, 1, 4), "SIZE");
|
||||||
[Blockly.Msg.senseBox_display_black, "BLACK,WHITE"],
|
this.appendDummyInput()
|
||||||
]),
|
.appendField(Blockly.Msg.senseBox_display_printDisplay_x)
|
||||||
"COLOR"
|
.appendField(new FieldSlider(0, 0, 64), "X");
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_display_printDisplay_y)
|
||||||
.appendField(Blockly.Msg.senseBox_display_setSize)
|
.appendField(new FieldSlider(0, 0, 128), "Y");
|
||||||
.appendField(new FieldSlider(1, 1, 4), "SIZE");
|
this.appendValueInput('printDisplay')
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_display_printDisplay_value)
|
||||||
.appendField(Blockly.Msg.senseBox_display_printDisplay_x)
|
.setCheck(null);
|
||||||
.appendField(new FieldSlider(0, 0, 127), "X");
|
this.setPreviousStatement(true, null);
|
||||||
this.appendDummyInput()
|
this.setNextStatement(true, null);
|
||||||
.appendField(Blockly.Msg.senseBox_display_printDisplay_y)
|
let variableName = this.getField('COLOR');
|
||||||
.appendField(new FieldSlider(0, 0, 63), "Y");
|
console.log(variableName.getValue());
|
||||||
this.appendValueInput("printDisplay")
|
this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tip);
|
||||||
.appendField(Blockly.Msg.senseBox_display_printDisplay_value)
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
.setCheck(null);
|
},
|
||||||
this.setPreviousStatement(true, null);
|
/**
|
||||||
this.setNextStatement(true, null);
|
* Called whenever anything on the workspace changes.
|
||||||
this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tooltip);
|
* Add warning if block is not nested inside a the correct loop.
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_display_helpurl);
|
* @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_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_tip);
|
||||||
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
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.setPreviousStatement(true, null);
|
||||||
|
this.setNextStatement(true, null);
|
||||||
|
},
|
||||||
|
/**
|
||||||
* 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_fastPrint"] = {
|
Blockly.Blocks['sensebox_display_drawRectangle'] = {
|
||||||
init: function (block) {
|
init: function () {
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendDummyInput().appendField(
|
this.appendDummyInput()
|
||||||
Blockly.Msg.senseBox_display_fastPrint_show
|
.appendField(Blockly.Msg.sensebox_display_drawRectangle);
|
||||||
);
|
this.appendValueInput('X')
|
||||||
this.appendValueInput("Title1", "Title1").appendField(
|
.appendField(Blockly.Msg.senseBox_display_printDisplay_x)
|
||||||
Blockly.Msg.senseBox_display_fastPrint_title
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
);
|
this.appendValueInput('Y')
|
||||||
this.appendValueInput("Value1", "Value1").appendField(
|
.appendField(Blockly.Msg.senseBox_display_printDisplay_y)
|
||||||
Blockly.Msg.senseBox_display_fastPrint_value
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
);
|
this.appendValueInput('width')
|
||||||
this.appendValueInput("Dimension1", "Dimension1").appendField(
|
.appendField(Blockly.Msg.sensebox_display_drawRectangle_width)
|
||||||
Blockly.Msg.senseBox_display_fastPrint_dimension
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
);
|
this.appendValueInput('height')
|
||||||
this.appendValueInput("Title2", "Title2").appendField(
|
.appendField(Blockly.Msg.sensebox_display_drawRectangle_height)
|
||||||
Blockly.Msg.senseBox_display_fastPrint_title
|
.setCheck(Types.NUMBER.compatibleTypes);
|
||||||
);
|
this.appendDummyInput('fill')
|
||||||
this.appendValueInput("Value2", "Value2").appendField(
|
.appendField(Blockly.Msg.senseBox_display_filled)
|
||||||
Blockly.Msg.senseBox_display_fastPrint_value
|
.appendField(new Blockly.FieldCheckbox("TRUE"), "FILL");
|
||||||
);
|
this.setInputsInline(false);
|
||||||
this.appendValueInput("Dimension2", "Dimension2").appendField(
|
this.setPreviousStatement(true, null);
|
||||||
Blockly.Msg.senseBox_display_fastPrint_dimension
|
this.setNextStatement(true, null);
|
||||||
);
|
},
|
||||||
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_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);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
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"],
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import * as Blockly from 'blockly';
|
import * as Blockly from 'blockly';
|
||||||
|
import { FieldSlider } from '@blockly/field-slider';
|
||||||
import { getColour } from '../helpers/colour'
|
import { getColour } from '../helpers/colour'
|
||||||
import { selectedBoard } from '../helpers/board'
|
import { selectedBoard } from '../helpers/board'
|
||||||
import * as Types from '../helpers/types'
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_led'] = {
|
Blockly.Blocks['sensebox_led'] = {
|
||||||
@@ -15,7 +16,7 @@ Blockly.Blocks['sensebox_led'] = {
|
|||||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_on, "HIGH"], [Blockly.Msg.senseBox_off, "LOW"]]), "STAT");
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_on, "HIGH"], [Blockly.Msg.senseBox_off, "LOW"]]), "STAT");
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_led_tooltip);
|
this.setTooltip(Blockly.Msg.senseBox_led_tip);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -26,155 +27,18 @@ Blockly.Blocks['sensebox_rgb_led'] = {
|
|||||||
.appendField(Blockly.Msg.senseBox_rgb_led)
|
.appendField(Blockly.Msg.senseBox_rgb_led)
|
||||||
.appendField("Pin:")
|
.appendField("Pin:")
|
||||||
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "PIN");
|
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "PIN");
|
||||||
|
this.appendDummyInput()
|
||||||
this.appendValueInput("COLOR", 'Number')
|
.appendField(Blockly.Msg.COLOUR_RGB_RED)//Blockly.Msg.senseBox_basic_red
|
||||||
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led_color)
|
.appendField(new FieldSlider(255, 0, 255), "RED");
|
||||||
.setCheck("Colour");
|
this.appendDummyInput()
|
||||||
// this.appendValueInput("RED", 'Number')
|
.appendField(Blockly.Msg.COLOUR_RGB_GREEN)//Blockly.Msg.senseBox_basic_green
|
||||||
// .appendField(Blockly.Msg.COLOUR_RGB_RED);//Blockly.Msg.senseBox_basic_red
|
.appendField(new FieldSlider(255, 0, 255), "GREEN");
|
||||||
// this.appendValueInput("GREEN", 'Number')
|
this.appendDummyInput()
|
||||||
// .appendField(Blockly.Msg.COLOUR_RGB_GREEN);//Blockly.Msg.senseBox_basic_green
|
.appendField(Blockly.Msg.COLOUR_RGB_BLUE)//Blockly.Msg.senseBox_basic_green
|
||||||
// this.appendValueInput("BLUE", 'Number')
|
.appendField(new FieldSlider(255, 0, 255), "BLUE");
|
||||||
// .appendField(Blockly.Msg.COLOUR_RGB_BLUE);
|
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_rgb_led_tip);
|
this.setTooltip(Blockly.Msg.senseBox_rgb_led_tip);
|
||||||
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_ws2818_led_init'] = {
|
|
||||||
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.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led_init)
|
|
||||||
.appendField("Port:")
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port")
|
|
||||||
this.appendValueInput("BRIGHTNESS", "brightness")
|
|
||||||
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_brightness));
|
|
||||||
this.appendValueInput("NUMBER", "number")
|
|
||||||
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_number));
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_ws2818_rgb_led_init_tooltip);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_ws2818_led'] = {
|
|
||||||
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.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led)
|
|
||||||
.appendField("Port:")
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port")
|
|
||||||
this.appendValueInput("POSITION", "position")
|
|
||||||
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_position));
|
|
||||||
this.appendValueInput("COLOR", 'Number')
|
|
||||||
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led_color)
|
|
||||||
.setCheck("Colour");
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_ws2818_rgb_led_tooltip);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT
|
|
||||||
// Block for colour picker.
|
|
||||||
{
|
|
||||||
"type": "colour_picker",
|
|
||||||
"message0": "%1",
|
|
||||||
"args0": [
|
|
||||||
{
|
|
||||||
"type": "field_colour",
|
|
||||||
"name": "COLOUR",
|
|
||||||
"colour": "#ff0000"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output": "Colour",
|
|
||||||
"helpUrl": "%{BKY_COLOUR_PICKER_HELPURL}",
|
|
||||||
"colour": getColour().sensebox,
|
|
||||||
"tooltip": "%{BKY_COLOUR_PICKER_TOOLTIP}",
|
|
||||||
"extensions": ["parent_tooltip_when_inline"]
|
|
||||||
},
|
|
||||||
|
|
||||||
// Block for random colour.
|
|
||||||
{
|
|
||||||
"type": "colour_random",
|
|
||||||
"message0": "%{BKY_COLOUR_RANDOM_TITLE}",
|
|
||||||
"output": "Colour",
|
|
||||||
"helpUrl": "%{BKY_COLOUR_RANDOM_HELPURL}",
|
|
||||||
"colour": getColour().sensebox,
|
|
||||||
"tooltip": "%{BKY_COLOUR_RANDOM_TOOLTIP}"
|
|
||||||
},
|
|
||||||
|
|
||||||
// Block for composing a colour from RGB components.
|
|
||||||
{
|
|
||||||
"type": "colour_rgb",
|
|
||||||
"message0": "%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3",
|
|
||||||
"args0": [
|
|
||||||
{
|
|
||||||
"type": "input_value",
|
|
||||||
"name": "RED",
|
|
||||||
"check": Types.getCompatibleTypes('int'),
|
|
||||||
"align": "RIGHT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input_value",
|
|
||||||
"name": "GREEN",
|
|
||||||
"check": Types.getCompatibleTypes('int'),
|
|
||||||
"align": "RIGHT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input_value",
|
|
||||||
"name": "BLUE",
|
|
||||||
"check": Types.getCompatibleTypes('int'),
|
|
||||||
"align": "RIGHT"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output": "Colour",
|
|
||||||
"helpUrl": "%{BKY_COLOUR_RGB_HELPURL}",
|
|
||||||
"colour": getColour().sensebox,
|
|
||||||
"tooltip": "%{BKY_COLOUR_RGB_TOOLTIP}"
|
|
||||||
},
|
|
||||||
|
|
||||||
// Block for blending two colours together.
|
|
||||||
{
|
|
||||||
"type": "colour_blend",
|
|
||||||
"message0": "%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} " +
|
|
||||||
"%1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3",
|
|
||||||
"args0": [
|
|
||||||
{
|
|
||||||
"type": "input_value",
|
|
||||||
"name": "COLOUR1",
|
|
||||||
"check": "Colour",
|
|
||||||
"align": "RIGHT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input_value",
|
|
||||||
"name": "COLOUR2",
|
|
||||||
"check": "Colour",
|
|
||||||
"align": "RIGHT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input_value",
|
|
||||||
"name": "RATIO",
|
|
||||||
"check": "Number",
|
|
||||||
"align": "RIGHT"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"output": "Colour",
|
|
||||||
"helpUrl": "%{BKY_COLOUR_BLEND_HELPURL}",
|
|
||||||
"style": "colour_blocks",
|
|
||||||
"tooltip": "%{BKY_COLOUR_BLEND_TOOLTIP}"
|
|
||||||
}
|
|
||||||
]); // END JSON EXTRACT (Do not delete this comment.)
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,320 +1,253 @@
|
|||||||
import * as Blockly from "blockly/core";
|
import * as Blockly from 'blockly/core';
|
||||||
import { getColour } from "../helpers/colour";
|
import { getColour } from '../helpers/colour';
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
----------------------------------LoRa--------------------------------------------------
|
----------------------------------LoRa--------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_lora_initialize_otaa"] = {
|
Blockly.Blocks['sensebox_lora_initialize_otaa'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_init_otaa_tooltip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_init_otaa_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_LoRa_init_helpurl);
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendDummyInput().appendField("Initialize LoRa (OTAA)");
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.appendField("Initialize LoRa (OTAA)");
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_device_id)
|
this.appendDummyInput()
|
||||||
.appendField("{")
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField(new Blockly.FieldTextInput("DEVICE ID"), "DEVICEID")
|
.appendField(Blockly.Msg.senseBox_LoRa_device_id)
|
||||||
.appendField("}");
|
.appendField(new Blockly.FieldTextInput("DEVICE ID"), "DEVICEID");
|
||||||
this.appendDummyInput()
|
this.appendDummyInput()
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_app_id)
|
.appendField(Blockly.Msg.senseBox_LoRa_app_id)
|
||||||
.appendField("{")
|
.appendField(new Blockly.FieldTextInput("APP ID"), "APPID");
|
||||||
.appendField(new Blockly.FieldTextInput("APP ID"), "APPID")
|
this.appendDummyInput()
|
||||||
.appendField("}");
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_LoRa_app_key)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(new Blockly.FieldTextInput("APP KEY"), "APPKEY");
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_app_key)
|
this.appendDummyInput()
|
||||||
.appendField("{")
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField(new Blockly.FieldTextInput("APP KEY"), "APPKEY")
|
.appendField(Blockly.Msg.senseBox_LoRa_interval)
|
||||||
.appendField("}");
|
.appendField(new Blockly.FieldTextInput("5"), "INTERVAL");
|
||||||
this.appendDummyInput()
|
this.setPreviousStatement(true, null);
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.setNextStatement(true, null);
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_interval)
|
},
|
||||||
.appendField(new Blockly.FieldTextInput("5"), "INTERVAL");
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_lora_initialize_abp"] = {
|
Blockly.Blocks['sensebox_lora_initialize_abp'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_init_abp_tooltip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_init_abp_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_LoRa_init_helpurl);
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendDummyInput().appendField("Initialize LoRa (ABP)");
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.appendField("Initialize LoRa (ABP)");
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.appendDummyInput()
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_nwskey_id)
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField("{")
|
.appendField(Blockly.Msg.senseBox_LoRa_nwskey_id)
|
||||||
.appendField(new Blockly.FieldTextInput("NWSKEY"), "NWSKEY")
|
.appendField(new Blockly.FieldTextInput("NWSKEY"), "NWSKEY");
|
||||||
.appendField("}");
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(Blockly.Msg.senseBox_LoRa_appskey_id)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_appskey_id)
|
.appendField(new Blockly.FieldTextInput("APPSKEY"), "APPSKEY");
|
||||||
.appendField("{")
|
this.appendDummyInput()
|
||||||
.appendField(new Blockly.FieldTextInput("APPSKEY"), "APPSKEY")
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField("}");
|
.appendField(Blockly.Msg.senseBox_LoRa_devaddr_id)
|
||||||
this.appendDummyInput()
|
.appendField(new Blockly.FieldTextInput("DEVADDR"), "DEVADDR");
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.appendDummyInput()
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_devaddr_id)
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField(new Blockly.FieldTextInput("DEVADDR"), "DEVADDR");
|
.appendField(Blockly.Msg.senseBox_LoRa_interval)
|
||||||
this.appendDummyInput()
|
.appendField(new Blockly.FieldTextInput("5"), "INTERVAL");
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
// this.appendStatementInput('DO')
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_interval)
|
// .appendField(Blockly.Msg.senseBox_measurements)
|
||||||
.appendField(new Blockly.FieldTextInput("5"), "INTERVAL");
|
// .setCheck(null);
|
||||||
// this.appendStatementInput('DO')
|
this.setPreviousStatement(true, null);
|
||||||
// .appendField(Blockly.Msg.senseBox_measurements)
|
this.setNextStatement(true, null);
|
||||||
// .setCheck(null);
|
},
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_lora_message_send"] = {
|
Blockly.Blocks['sensebox_lora_message_send'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_message_tooltip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_message_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendStatementInput("DO")
|
this.appendStatementInput('DO')
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_send_message)
|
.appendField(Blockly.Msg.senseBox_LoRa_send_message)
|
||||||
.setCheck(null);
|
.setCheck(null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_send_lora_sensor_value"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_sensor_tip);
|
|
||||||
this.setHelpUrl("");
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.appendValueInput("Value").appendField(
|
|
||||||
Blockly.Msg.senseBox_measurement
|
|
||||||
);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField("Bytes")
|
|
||||||
.appendField(new Blockly.FieldTextInput("2"), "MESSAGE_BYTES");
|
|
||||||
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_lora_message_send"],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_lora_ttn_mapper"] = {
|
Blockly.Blocks['sensebox_send_lora_sensor_value'] = {
|
||||||
init: function (block) {
|
init: function () {
|
||||||
this.setColour(getColour().sensebox);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_sensor_tip);
|
||||||
this.appendDummyInput().appendField("TTN Mapper");
|
this.setHelpUrl('');
|
||||||
this.appendDummyInput()
|
this.setColour(getColour().sensebox);
|
||||||
.setAlign(Blockly.ALIGN_RIGHT)
|
this.appendValueInput('Value')
|
||||||
.appendField("Fix Type Limit")
|
.appendField(Blockly.Msg.senseBox_measurement)
|
||||||
.appendField(
|
this.appendDummyInput()
|
||||||
new Blockly.FieldDropdown(
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
[
|
.appendField("Bytes")
|
||||||
["0", "0"],
|
.appendField(new Blockly.FieldTextInput("2"), "MESSAGE_BYTES");
|
||||||
["1", "1"],
|
this.setPreviousStatement(true, null);
|
||||||
["2", "2"],
|
this.setNextStatement(true, null);
|
||||||
["3", "3"],
|
},
|
||||||
].reverse()
|
/**
|
||||||
),
|
* Called whenever anything on the workspace changes.
|
||||||
"dropdown"
|
* Add warning if block is not nested inside a the correct loop.
|
||||||
);
|
* @param {!Blockly.Events.Abstract} e Change event.
|
||||||
// reverse() because i want 3 be be at first and i'm to lazy to write the array again
|
* @this Blockly.Block
|
||||||
this.appendValueInput("Latitude")
|
*/
|
||||||
.appendField(Blockly.Msg.senseBox_gps_lat)
|
onchange: function (e) {
|
||||||
.setCheck(null);
|
var legal = false;
|
||||||
this.appendValueInput("Longitude")
|
// Is the block nested in a loop?
|
||||||
.appendField(Blockly.Msg.senseBox_gps_lng)
|
var block = this;
|
||||||
.setCheck(null);
|
do {
|
||||||
this.appendValueInput("Altitude")
|
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
|
||||||
.appendField(Blockly.Msg.senseBox_gps_alt)
|
legal = true;
|
||||||
.setCheck(null);
|
break;
|
||||||
this.appendValueInput("pDOP").appendField("pDOP").setCheck(null);
|
}
|
||||||
this.appendValueInput("Fix Type").appendField("Fix Type").setCheck(null);
|
block = block.getSurroundParent();
|
||||||
this.setPreviousStatement(true, null);
|
} while (block);
|
||||||
this.setNextStatement(true, null);
|
if (legal) {
|
||||||
this.setTooltip(Blockly.Msg.sensebox_lora_ttn_mapper_tip);
|
this.setWarningText(null);
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_lora_ttn_mapper_helpurl);
|
} else {
|
||||||
},
|
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
LOOP_TYPES: ['sensebox_lora_message_send'],
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_send"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_send'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendStatementInput("DO")
|
this.appendStatementInput('DO')
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_send_cayenne)
|
.appendField(Blockly.Msg.senseBox_LoRa_send_cayenne)
|
||||||
.setCheck(null);
|
.setCheck(null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_temperature"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_temperature'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_temperature_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_temperature_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("Value").appendField(
|
this.appendValueInput('Value')
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_temperature
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_temperature)
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
this.setPreviousStatement(true, null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
},
|
||||||
},
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
|
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_humidity"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_humidity'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_humidity_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_humidity_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("Value").appendField(
|
this.appendValueInput('Value')
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_humidity
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_humidity)
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
this.setPreviousStatement(true, null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
},
|
||||||
},
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
|
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_pressure"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_pressure'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_pressure_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_pressure_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("Value").appendField(
|
this.appendValueInput('Value')
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_pressure
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_pressure)
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
this.setPreviousStatement(true, null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
},
|
||||||
},
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
|
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_luminosity"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_luminosity'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_luminosity_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_luminosity_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("Value").appendField(
|
this.appendValueInput('Value')
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_luminosity
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_luminosity)
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
this.setPreviousStatement(true, null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
},
|
||||||
},
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
|
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_sensor"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_sensor'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_analog_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_analog_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("Value").appendField(
|
this.appendValueInput('Value')
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_analog
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_analog)
|
||||||
);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
this.setPreviousStatement(true, null);
|
||||||
this.setPreviousStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
},
|
||||||
},
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
|
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_accelerometer"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_accelerometer'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_gyros_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_gyros_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("X").appendField(Blockly.Msg.senseBox_LoRa_cayenne_x);
|
this.appendValueInput('X')
|
||||||
this.appendValueInput("Y").appendField(Blockly.Msg.senseBox_LoRa_cayenne_y);
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_x)
|
||||||
this.appendValueInput("Z").appendField(Blockly.Msg.senseBox_LoRa_cayenne_z);
|
this.appendValueInput('Y')
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_y)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.appendValueInput('Z')
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_z)
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
this.appendDummyInput()
|
||||||
this.setPreviousStatement(true, null);
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
this.setNextStatement(true, null);
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
},
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
LOOP_TYPES: ["sensebox_lora_cayenne_send"],
|
this.setPreviousStatement(true, null);
|
||||||
|
this.setNextStatement(true, null);
|
||||||
|
},
|
||||||
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
};
|
};
|
||||||
Blockly.Blocks["sensebox_lora_cayenne_gps"] = {
|
Blockly.Blocks['sensebox_lora_cayenne_gps'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_gps_tip);
|
this.setTooltip(Blockly.Msg.senseBox_LoRa_cayenne_gps_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendValueInput("LAT").appendField(
|
this.appendValueInput('LAT')
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_lat
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_lat)
|
||||||
);
|
this.appendValueInput('LNG')
|
||||||
this.appendValueInput("LNG").appendField(
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_lng)
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_lng
|
this.appendValueInput('ALT')
|
||||||
);
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_alt)
|
||||||
this.appendValueInput("ALT").appendField(
|
this.appendDummyInput()
|
||||||
Blockly.Msg.senseBox_LoRa_cayenne_alt
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
);
|
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
||||||
this.appendDummyInput()
|
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.setPreviousStatement(true, null);
|
||||||
.appendField(Blockly.Msg.senseBox_LoRa_cayenne_channel)
|
this.setNextStatement(true, null);
|
||||||
.appendField(new Blockly.FieldTextInput("1"), "CHANNEL");
|
},
|
||||||
this.setPreviousStatement(true, null);
|
LOOP_TYPES: ['sensebox_lora_cayenne_send'],
|
||||||
this.setNextStatement(true, null);
|
|
||||||
},
|
|
||||||
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"],
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,199 +1,112 @@
|
|||||||
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";
|
|
||||||
|
|
||||||
var boxes = store.getState().auth.user
|
Blockly.Blocks['sensebox_osem_connection'] = {
|
||||||
? store.getState().auth.user.boxes
|
init: function () {
|
||||||
: null;
|
this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip);
|
||||||
store.subscribe(() => {
|
this.setHelpUrl('');
|
||||||
boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null;
|
this.setColour(getColour().sensebox);
|
||||||
});
|
this.appendDummyInput()
|
||||||
var selectedBox = "";
|
.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");
|
||||||
|
this.appendDummyInput()
|
||||||
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
|
.appendField("senseBox ID")
|
||||||
|
.appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID");
|
||||||
|
this.appendStatementInput('DO')
|
||||||
|
.appendField(Blockly.Msg.senseBox_sensor)
|
||||||
|
.setCheck(null);
|
||||||
|
this.setPreviousStatement(true, null);
|
||||||
|
this.setNextStatement(true, null);
|
||||||
|
},
|
||||||
|
onchange: function (e) {
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_osem_connection"] = {
|
//Blockly.Blocks.sensebox.getDescendants = blocks;
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
},
|
||||||
|
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);
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* List of block types that are loops and thus do not need warnings.
|
* Modify this block to have the correct number of pins available.
|
||||||
* To add a new loop type add this to your code:
|
* @param {boolean}
|
||||||
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
|
* @private
|
||||||
|
* @this Blockly.Block
|
||||||
*/
|
*/
|
||||||
selectedBox = this.getFieldValue("BoxID");
|
updateShape_: function () {
|
||||||
if (selectedBox !== "" && boxes) {
|
var extraFieldExist = this.getFieldValue('gps');
|
||||||
var accessToken = boxes.find(
|
var input = this.getFieldValue('type');
|
||||||
(element) => element._id === selectedBox
|
if ((input === 'Mobile') && extraFieldExist === null) {
|
||||||
).access_token;
|
this.appendValueInput('lat', 'Number')
|
||||||
if (accessToken !== undefined) {
|
.appendField(Blockly.Msg.senseBox_gps_lat, 'gps');
|
||||||
this.getField("access_token").setValue(accessToken);
|
this.appendValueInput('lng', 'Number')
|
||||||
} else {
|
.appendField(Blockly.Msg.senseBox_gps_lng);
|
||||||
this.getField("access_token").setValue("access_token");
|
this.appendValueInput('altitude', 'Number')
|
||||||
}
|
.appendField(Blockly.Msg.senseBox_gps_alt);
|
||||||
}
|
this.appendValueInput('timeStamp', 'Number')
|
||||||
},
|
.appendField(Blockly.Msg.senseBox_gps_timeStamp);
|
||||||
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
|
|
||||||
);
|
|
||||||
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"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip);
|
|
||||||
this.setHelpUrl("");
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_send_to_osem);
|
|
||||||
if (boxes) {
|
|
||||||
this.appendValueInput("Value")
|
|
||||||
.appendField("Phänomen")
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldDropdown(this.generateOptions),
|
|
||||||
"SensorID"
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
this.appendValueInput("Value")
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField("Phänomen")
|
|
||||||
.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]);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (dropdown.length > 1) {
|
if (input === 'Stationary' && extraFieldExist !== null) {
|
||||||
var options = dropdown.slice(1);
|
this.removeInput('lat');
|
||||||
return options;
|
this.removeInput('lng');
|
||||||
} else {
|
this.removeInput('altitude');
|
||||||
return dropdown;
|
this.removeInput('timeStamp');
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
return dropdown;
|
};
|
||||||
},
|
Blockly.Blocks['sensebox_send_to_osem'] = {
|
||||||
/**
|
init: function () {
|
||||||
* Called whenever anything on the workspace changes.
|
this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip);
|
||||||
* Add warning if block is not nested inside a the correct loop.
|
this.setHelpUrl('');
|
||||||
* @param {!Blockly.Events.Abstract} e Change event.
|
this.setColour(getColour().sensebox);
|
||||||
* @this Blockly.Block
|
this.appendDummyInput()
|
||||||
*/
|
.appendField(Blockly.Msg.senseBox_send_to_osem);
|
||||||
onchange: function () {
|
this.appendValueInput('Value')
|
||||||
var legal = false;
|
.setCheck(null)
|
||||||
// Is the block nested in a loop?
|
.appendField('Sensor ID')
|
||||||
var block = this;
|
.appendField(new Blockly.FieldTextInput('Sensor ID'), 'SensorID');
|
||||||
do {
|
this.setPreviousStatement(true, null);
|
||||||
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
|
this.setNextStatement(true, null);
|
||||||
legal = true;
|
},
|
||||||
break;
|
/**
|
||||||
}
|
* Called whenever anything on the workspace changes.
|
||||||
block = block.getSurroundParent();
|
* Add warning if block is not nested inside a the correct loop.
|
||||||
} while (block);
|
* @param {!Blockly.Events.Abstract} e Change event.
|
||||||
if (legal) {
|
* @this Blockly.Block
|
||||||
this.setWarningText(null);
|
*/
|
||||||
} else {
|
onchange: function (e) {
|
||||||
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
|
var legal = false;
|
||||||
}
|
// Is the block nested in a loop?
|
||||||
},
|
var block = this;
|
||||||
/**
|
do {
|
||||||
* List of block types that are loops and thus do not need warnings.
|
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
|
||||||
* To add a new loop type add this to your code:
|
legal = true;
|
||||||
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
|
break;
|
||||||
*/
|
}
|
||||||
LOOP_TYPES: ["sensebox_osem_connection"],
|
block = block.getSurroundParent();
|
||||||
|
} while (block);
|
||||||
|
if (legal) {
|
||||||
|
this.setWarningText(null);
|
||||||
|
} else {
|
||||||
|
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
LOOP_TYPES: ['sensebox_osem_connection'],
|
||||||
};
|
};
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
import * as Blockly from "blockly";
|
|
||||||
import { getColour } from "../helpers/colour";
|
|
||||||
import * as Types from "../helpers/types";
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_rtc_init"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
|
|
||||||
this.setColour(getColour().time);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.sensebox_rtc_init);
|
|
||||||
this.setPreviousStatement(true);
|
|
||||||
this.setNextStatement(true);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_rtc_init_tooltip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_rtc_set"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
|
|
||||||
this.setColour(getColour().time);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.sensebox_rtc_set);
|
|
||||||
this.appendValueInput("second").appendField(
|
|
||||||
Blockly.Msg.sensebox_rtc_second
|
|
||||||
);
|
|
||||||
this.appendValueInput("minutes").appendField(
|
|
||||||
Blockly.Msg.sensebox_rtc_minutes
|
|
||||||
);
|
|
||||||
this.appendValueInput("hour").appendField(Blockly.Msg.sensebox_rtc_hour);
|
|
||||||
this.appendValueInput("day").appendField(Blockly.Msg.sensebox_rtc_day);
|
|
||||||
this.appendValueInput("month").appendField(Blockly.Msg.sensebox_rtc_month);
|
|
||||||
this.appendValueInput("year").appendField(Blockly.Msg.sensebox_rtc_year);
|
|
||||||
this.setPreviousStatement(true);
|
|
||||||
this.setNextStatement(true);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_rtc_set_tooltip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_rtc_set_ntp"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
|
|
||||||
this.setColour(getColour().time);
|
|
||||||
this.appendValueInput("time").appendField(Blockly.Msg.sensebox_rtc_set_ntp);
|
|
||||||
this.setPreviousStatement(true);
|
|
||||||
this.setNextStatement(true);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_rtc_set_ntp_tooltip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_rtc_get"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_rtc_helpurl);
|
|
||||||
this.setColour(getColour().time);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_rtc_get)
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
[Blockly.Msg.sensebox_rtc_hour, "hour"],
|
|
||||||
[Blockly.Msg.sensebox_rtc_minutes, "minutes"],
|
|
||||||
[Blockly.Msg.sensebox_rtc_second, "seconds"],
|
|
||||||
[Blockly.Msg.sensebox_rtc_day, "day"],
|
|
||||||
[Blockly.Msg.sensebox_rtc_month, "month"],
|
|
||||||
[Blockly.Msg.sensebox_rtc_year, "year"],
|
|
||||||
]),
|
|
||||||
"dropdown"
|
|
||||||
);
|
|
||||||
this.setOutput(true, Types.LARGE_NUMBER.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_rtc_get_tooltip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_rtc_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);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,174 +1,80 @@
|
|||||||
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", checkFileName),
|
new Blockly.FieldTextInput('Data.txt'),
|
||||||
"Filename"
|
'Filename');
|
||||||
)
|
this.appendStatementInput('SD')
|
||||||
.appendField(".")
|
.setCheck(null);
|
||||||
.appendField(
|
this.setPreviousStatement(true, null);
|
||||||
new Blockly.FieldDropdown([
|
this.setNextStatement(true, null);
|
||||||
["txt", "txt"],
|
this.setColour(getColour().sensebox);
|
||||||
["csv", "csv"],
|
this.setTooltip(Blockly.Msg.senseBox_output_safetosd_tip);
|
||||||
]),
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
"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_osem"] = {
|
Blockly.Blocks['sensebox_sd_create_file'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.sensebox_sd_osem_tip);
|
this.appendDummyInput()
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
|
.appendField(Blockly.Msg.senseBox_sd_create_file)
|
||||||
this.setColour(getColour().sensebox);
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_output_filename)
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
.appendField(
|
||||||
.appendField(Blockly.Msg.sensebox_sd_osem);
|
new Blockly.FieldTextInput('Data.txt'),
|
||||||
this.appendDummyInput()
|
'Filename');
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.setPreviousStatement(true, null);
|
||||||
.appendField(Blockly.Msg.senseBox_osem_exposure)
|
this.setNextStatement(true, null);
|
||||||
.appendField(
|
this.setColour(getColour().sensebox);
|
||||||
new Blockly.FieldDropdown([
|
this.setTooltip(Blockly.Msg.senseBox_output_safetosd_tip);
|
||||||
[Blockly.Msg.senseBox_osem_stationary, "Stationary"],
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
[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_save_for_osem"] = {
|
Blockly.Blocks['sensebox_sd_write_file'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setTooltip(Blockly.Msg.sensebox_sd_save_for_osem_tip);
|
this.appendDummyInput()
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_sd_helpurl);
|
.appendField(Blockly.Msg.senseBox_sd_write_file)
|
||||||
this.setColour(getColour().sensebox);
|
.setAlign(Blockly.ALIGN_LEFT);
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.sensebox_sd_save_for_osem);
|
this.appendValueInput('DATA')
|
||||||
this.appendValueInput("Value")
|
.setCheck(null);
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.appendDummyInput('CheckboxText')
|
||||||
.appendField(Blockly.Msg.sensebox_sd_save_for_osem_id)
|
.appendField(Blockly.Msg.senseBox_output_linebreak)
|
||||||
.appendField(new Blockly.FieldTextInput("sensorID"), "SensorID");
|
.appendField(new Blockly.FieldCheckbox('TRUE'), 'linebreak');
|
||||||
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_output_safetosd_tip);
|
||||||
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 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'],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,32 +1,26 @@
|
|||||||
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().appendField(Blockly.Msg.senseBox_temp_hum);
|
this.appendDummyInput()
|
||||||
|
.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(
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_hum, "Humidity"]]), "NAME");
|
||||||
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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_temp_hum_helpurl);
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,64 +28,43 @@ Blockly.Blocks["sensebox_sensor_temp_hum"] = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_sensor_uv_light"] = {
|
|
||||||
|
Blockly.Blocks['sensebox_sensor_uv_light'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_uv_light);
|
this.appendDummyInput()
|
||||||
|
.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(
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_light, "Illuminance"], [Blockly.Msg.senseBox_uv, "UvIntensity"]]), "NAME");
|
||||||
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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_uv_light_helpurl);
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
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().appendField(
|
this.appendDummyInput()
|
||||||
Blockly.Msg.senseBox_bmx055_accelerometer
|
.appendField(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(
|
.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");
|
||||||
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(
|
.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");
|
||||||
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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_bmx055_helpurl);
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -99,111 +72,111 @@ Blockly.Blocks["sensebox_sensor_bmx055_accelerometer"] = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_sensor_sds011"] = {
|
Blockly.Blocks['sensebox_sensor_sds011'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_sds011);
|
this.appendDummyInput()
|
||||||
|
.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(
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_sds011_pm25, "Pm25"], [Blockly.Msg.senseBox_sds011_pm10, "Pm10"]]), "NAME")
|
||||||
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(
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_sds011_serial1, "Serial1"], [Blockly.Msg.senseBox_sds011_serial2, "Serial2"]]), "SERIAL");
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
[Blockly.Msg.senseBox_sds011_serial1, "Serial1"],
|
|
||||||
[Blockly.Msg.senseBox_sds011_serial2, "Serial2"],
|
|
||||||
]),
|
|
||||||
"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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_sds011_helpurl);
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BMP280 Pressure Sensor
|
* BMP280 Pressure Sensor
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_sensor_pressure"] = {
|
Blockly.Blocks['sensebox_sensor_pressure'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
var dropdownOptions = [
|
var dropdownOptions = [[Blockly.Msg.senseBox_pressure, "Pressure"], [Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_gps_alt, "Altitude"]];
|
||||||
[Blockly.Msg.senseBox_pressure, "Pressure"],
|
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (option) {
|
||||||
[Blockly.Msg.senseBox_temp, "Temperature"],
|
var input = (option === 'Pressure') || (option === 'Temperature') || (option === 'Altitude');
|
||||||
[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().appendField(Blockly.Msg.senseBox_pressure_sensor);
|
this.appendDummyInput()
|
||||||
|
.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)
|
||||||
.appendField(dropdown, "NAME");
|
.appendField(dropdown, "NAME");
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl);
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/luftdruck.html');
|
||||||
this.getField("NAME").setValidator(
|
|
||||||
function (val) {
|
|
||||||
this.updateShape_(val === "Altitude");
|
|
||||||
}.bind(this)
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
updateShape_(isAltitude) {
|
/**
|
||||||
if (isAltitude) {
|
* Parse XML to restore the number of pins available.
|
||||||
if (this.getInput("extraField") == null) {
|
* @param {!Element} xmlElement XML storage element.
|
||||||
this.appendDummyInput("extraField")
|
* @this Blockly.Block
|
||||||
.setAlign(Blockly.ALIGN_RIGHT)
|
*/
|
||||||
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
|
|
||||||
.appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
|
domToMutation: function (xmlElement) {
|
||||||
.appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
|
(xmlElement.getAttribute('port'));
|
||||||
}
|
|
||||||
} 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 = [
|
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"]];
|
||||||
[Blockly.Msg.senseBox_temp, "temperature"],
|
this.appendDummyInput()
|
||||||
[Blockly.Msg.senseBox_hum, "humidity"],
|
.appendField(Blockly.Msg.senseBox_bme680);
|
||||||
[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"],
|
|
||||||
];
|
|
||||||
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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_bme680_helpurl);
|
}
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -212,15 +185,14 @@ Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = {
|
|
||||||
|
Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
var dropdownOptions = [
|
|
||||||
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
|
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, 'A'],
|
||||||
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
|
[Blockly.Msg.senseBox_ultrasonic_port_B, 'B'], [Blockly.Msg.senseBox_ultrasonic_port_C, 'C']];
|
||||||
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
|
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (option) {
|
||||||
];
|
var input = (option === 'A') || (option === 'B') || (option === 'C');
|
||||||
var dropdown = new FieldGridDropdown(dropdownOptions, function (option) {
|
|
||||||
var input = option === "A" || option === "B" || option === "C";
|
|
||||||
this.sourceBlock_.updateShape_(input);
|
this.sourceBlock_.updateShape_(input);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -228,25 +200,17 @@ 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(
|
.appendField(new Blockly.FieldDropdown(
|
||||||
new Blockly.FieldDropdown(selectedBoard().digitalPins),
|
selectedBoard().digitalPins), 'ultrasonic_trigger')
|
||||||
"ultrasonic_trigger"
|
|
||||||
)
|
|
||||||
.appendField(Blockly.Msg.senseBox_ultrasonic_echo)
|
.appendField(Blockly.Msg.senseBox_ultrasonic_echo)
|
||||||
.appendField(
|
.appendField(new Blockly.FieldDropdown(
|
||||||
new Blockly.FieldDropdown(selectedBoard().digitalPins),
|
selectedBoard().digitalPins), 'ultrasonic_echo');
|
||||||
"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_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_ultrasonic_helpurl);
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Parse XML to restore the number of pins available.
|
* Parse XML to restore the number of pins available.
|
||||||
@@ -254,7 +218,8 @@ 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.
|
||||||
@@ -262,8 +227,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;
|
||||||
@@ -275,326 +240,84 @@ 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(
|
.appendField(new Blockly.FieldDropdown(selectedBoard().analogPins), "PIN")
|
||||||
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_tip);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_sound_tooltip);
|
this.setTooltip('Dieser Sensor mist den Geräuschpegel.');
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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(
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_button_isPressed, "isPressed"], [Blockly.Msg.senseBox_button_wasPressed, "wasPressed"], [Blockly.Msg.senseBox_button_switch, "Switch"]]), "FUNCTION")
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
[Blockly.Msg.senseBox_button_isPressed, "isPressed"],
|
|
||||||
[Blockly.Msg.senseBox_button_wasPressed, "wasPressed"],
|
|
||||||
[Blockly.Msg.senseBox_button_longPress, "longPress"],
|
|
||||||
]),
|
|
||||||
"FUNCTION"
|
|
||||||
)
|
|
||||||
.appendField("Pin:")
|
.appendField("Pin:")
|
||||||
.appendField(
|
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsButton), "PIN");
|
||||||
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_tip);
|
||||||
this.getField("FUNCTION").setValidator(
|
this.setHelpUrl('https://sensebox.de/books');
|
||||||
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 = [
|
var dropdownOptions = [[Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"], [Blockly.Msg.senseBox_bme_co2, "CO2"]];
|
||||||
[Blockly.Msg.senseBox_scd_co2, "CO2"],
|
this.appendDummyInput()
|
||||||
[Blockly.Msg.senseBox_temp, "temperature"],
|
.appendField(Blockly.Msg.senseBox_scd30);
|
||||||
[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_bme_tip);
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_scd_helpurl);
|
|
||||||
},
|
|
||||||
onchange: function (e) {
|
|
||||||
var dropdown = this.getFieldValue("dropdown");
|
|
||||||
if (dropdown === "temperature" || dropdown === "humidity") {
|
|
||||||
this.setOutput(true, Types.DECIMAL.typeName);
|
|
||||||
} else if (dropdown === "CO2") {
|
|
||||||
this.setOutput(true, Types.NUMBER.typeName);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GPS Module
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_gps"] = {
|
|
||||||
init: function () {
|
|
||||||
var dropdownOptions = [
|
|
||||||
[Blockly.Msg.senseBox_gps_lat, "latitude"],
|
|
||||||
[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()
|
|
||||||
.setAlign(Blockly.ALIGN_RIGHT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_value)
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown");
|
|
||||||
this.setOutput(true, Types.NUMBER.typeName);
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_gps_tooltip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block for Truebner STM50
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
|
|
||||||
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.appendDummyInput().appendField(Blockly.Msg.senseBox_smt50);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField("Port:")
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_value)
|
|
||||||
.appendField(
|
|
||||||
new Blockly.FieldDropdown([
|
|
||||||
[Blockly.Msg.senseBox_temp, "temp"],
|
|
||||||
[Blockly.Msg.senseBox_soil, "soil"],
|
|
||||||
]),
|
|
||||||
"value"
|
|
||||||
);
|
|
||||||
this.setOutput(true, Types.NUMBER.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_smt50_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_smt50_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DS18B20 Watertemperature
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_sensor_watertemperature"] = {
|
|
||||||
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.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_watertemperature)
|
|
||||||
.appendField("Port:")
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
|
|
||||||
this.setOutput(true, Types.NUMBER.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Windspeed
|
|
||||||
* removed for now
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_windspeed'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_windspeed)
|
|
||||||
.appendField("Pin:")
|
|
||||||
.appendField(new Blockly.FieldDropdown(selectedBoard().analogPins), "PIN")
|
|
||||||
this.setOutput(true, Types.DECIMAL.typeName);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DF Robot Soundsensor
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_soundsensor_dfrobot"] = {
|
|
||||||
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.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_soundsensor_dfrobot)
|
|
||||||
.appendField("Port:")
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
|
|
||||||
this.setOutput(true, Types.DECIMAL.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rainsensor hydreon rg-15
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_rainsensor_hydreon_rg15"] = {
|
|
||||||
init: function () {
|
|
||||||
var dropdownOptionsPorts = [
|
|
||||||
[Blockly.Msg.sensebox_rainsensor_hydreon_rg15_serial1, "Serial1"],
|
|
||||||
[Blockly.Msg.sensebox_rainsensor_hydreon_rg15_serial2, "Serial2"],
|
|
||||||
];
|
|
||||||
var dropdownOptionsValues = [
|
|
||||||
[Blockly.Msg.sensebox_rainsensor_hydreon_rg15_acc, "getAccumulation"],
|
|
||||||
[Blockly.Msg.sensebox_rainsensor_hydreon_rg15_totalAcc, "getTotalAccumulation"],
|
|
||||||
[Blockly.Msg.sensebox_rainsensor_hydreon_rg15_eventAcc, "getEventAccumulation"],
|
|
||||||
[Blockly.Msg.sensebox_rainsensor_hydreon_rg15_rainInt, "getRainfallIntensity"],
|
|
||||||
];
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_rainsensor_hydreon_rg15);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_rainsensor_hydreon_rg15_port)
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptionsPorts), "SERIAL");
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.sensebox_rainsensor_hydreon_rg15_value)
|
|
||||||
.appendField(new Blockly.FieldDropdown(dropdownOptionsValues), "VALUE");
|
|
||||||
this.setOutput(true, Types.DECIMAL.typeName);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_rainsensor_hydreon_rg15_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_rainsensor_hydreon_rg15_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.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);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ Blockly.Blocks["sensebox_telegram"] = {
|
|||||||
.appendField("telegram")
|
.appendField("telegram")
|
||||||
.appendField(new Blockly.FieldTextInput("token"), "telegram_token");
|
.appendField(new Blockly.FieldTextInput("token"), "telegram_token");
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_telegram_init_tooltip);
|
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -25,7 +24,6 @@ Blockly.Blocks["sensebox_telegram_do"] = {
|
|||||||
this.appendStatementInput("telegram_do");
|
this.appendStatementInput("telegram_do");
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_telegram_do_tooltip)
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -38,7 +36,6 @@ Blockly.Blocks["sensebox_telegram_do_on_message"] = {
|
|||||||
.appendField(Blockly.Msg.senseBox_telegram_message)
|
.appendField(Blockly.Msg.senseBox_telegram_message)
|
||||||
.appendField(new Blockly.FieldTextInput("/message"), 'telegram_message');
|
.appendField(new Blockly.FieldTextInput("/message"), 'telegram_message');
|
||||||
this.appendStatementInput("telegram_do_on_message").setCheck(null);
|
this.appendStatementInput("telegram_do_on_message").setCheck(null);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_telegram_message_tooltip)
|
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
}
|
}
|
||||||
@@ -49,10 +46,8 @@ Blockly.Blocks["sensebox_telegram_send"] = {
|
|||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_telegram_send);
|
this.appendDummyInput().appendField(Blockly.Msg.senseBox_telegram_send);
|
||||||
this.appendValueInput("telegram_text_to_send").setCheck(null);
|
this.appendValueInput("telegram_text_to_send").setCheck(null);
|
||||||
this.setTooltip(Blockly.Msg.senseBox_telegram_send_tooltip)
|
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
|
|
||||||
},
|
},
|
||||||
LOOP_TYPES: ["sensebox_telegram_do_on_message"]
|
LOOP_TYPES: ["sensebox_telegram_do_on_message"]
|
||||||
};
|
};
|
||||||
@@ -1,153 +1,58 @@
|
|||||||
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_tip);
|
||||||
this.setHelpUrl("");
|
this.setHelpUrl('');
|
||||||
this.setColour(getColour().sensebox);
|
this.setColour(getColour().sensebox);
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_connect);
|
this.appendDummyInput()
|
||||||
this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_wifi_connect);
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.appendDummyInput()
|
||||||
.appendField(Blockly.Msg.senseBox_wifi_ssid)
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField(new Blockly.FieldTextInput("SSID"), "SSID");
|
.appendField(Blockly.Msg.senseBox_wifi_ssid)
|
||||||
this.appendDummyInput()
|
.appendField(new Blockly.FieldTextInput("SSID"), "SSID");
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
this.appendDummyInput()
|
||||||
.appendField(Blockly.Msg.senseBox_output_password)
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
.appendField(new Blockly.FieldTextInput("Password"), "Password");
|
.appendField(Blockly.Msg.senseBox_output_password)
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_wifi_helpurl);
|
.appendField(new Blockly.FieldTextInput("Password"), "Password");
|
||||||
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'],
|
||||||
|
};
|
||||||
|
|
||||||
|
Blockly.Blocks['sensebox_startap'] = {
|
||||||
|
init: function () {
|
||||||
|
this.setTooltip(Blockly.Msg.senseBox_wifi_tip);
|
||||||
|
this.setHelpUrl('');
|
||||||
|
this.setColour(getColour().sensebox);
|
||||||
|
this.appendDummyInput()
|
||||||
|
.appendField(Blockly.Msg.senseBox_wifi_startap);
|
||||||
|
this.appendDummyInput()
|
||||||
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
|
.appendField(Blockly.Msg.senseBox_wifi_ssid)
|
||||||
|
.appendField(new Blockly.FieldTextInput("SSID"), "SSID");
|
||||||
|
this.setPreviousStatement(true, null);
|
||||||
|
this.setNextStatement(true, null);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
LOOP_TYPES: ["arduino_functions"],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_startap"] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_wifi_startap_tooltip);
|
|
||||||
this.setHelpUrl("");
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_wifi_startap);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.senseBox_wifi_ssid)
|
|
||||||
.appendField(new Blockly.FieldTextInput("SSID"), "SSID");
|
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_wifi_helpurl);
|
|
||||||
this.setPreviousStatement(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);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,36 +1,4 @@
|
|||||||
import * as Blockly from "blockly/core";
|
|
||||||
import { getColour } from "../helpers/colour";
|
|
||||||
import * as Types from "../helpers/types";
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_multiplexer_init"] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_multiplexer_init);
|
|
||||||
this.appendValueInput("nrChannels").setCheck(
|
|
||||||
Types.getCompatibleTypes("int")
|
|
||||||
);
|
|
||||||
this.appendDummyInput().appendField(
|
|
||||||
Blockly.Msg.senseBox_multplexer_nchannels
|
|
||||||
);
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setInputsInline("true");
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_multiplexer_init_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.senseBox_multiplexer_init_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["sensebox_multiplexer_changeChannel"] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput().appendField(
|
|
||||||
Blockly.Msg.senseBox_multiplexer_changeChannel
|
|
||||||
);
|
|
||||||
this.appendValueInput("Channel").setCheck(Types.getCompatibleTypes("int"));
|
|
||||||
this.setInputsInline("true");
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.setColour(getColour().sensebox);
|
|
||||||
this.setTooltip(Blockly.Msg.sensebox_multiplexer_changeChannel_tooltip);
|
|
||||||
this.setHelpUrl(Blockly.Msg.sensebox_multiplexer_changeChannel_helpurl);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
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);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -8,135 +8,123 @@
|
|||||||
* 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
|
/**
|
||||||
* @this Blockly.Block
|
* Delay block definition
|
||||||
*/
|
* @this Blockly.Block
|
||||||
init: function () {
|
*/
|
||||||
this.setHelpUrl("http://arduino.cc/en/Reference/Delay");
|
init: function () {
|
||||||
this.setColour(getColour().time);
|
this.setHelpUrl('http://arduino.cc/en/Reference/Delay');
|
||||||
this.appendValueInput("DELAY_TIME_MILI")
|
this.setColour(getColour().time);
|
||||||
.setCheck(Types.NUMBER.checkList)
|
this.appendValueInput('DELAY_TIME_MILI')
|
||||||
.appendField(Blockly.Msg.ARD_TIME_DELAY);
|
.setCheck(Types.NUMBER.checkList)
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MS);
|
.appendField(Blockly.Msg.ARD_TIME_DELAY);
|
||||||
this.setInputsInline(true);
|
this.appendDummyInput()
|
||||||
this.setPreviousStatement(true, null);
|
.appendField(Blockly.Msg.ARD_TIME_MS);
|
||||||
this.setNextStatement(true, null);
|
this.setInputsInline(true);
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP);
|
this.setPreviousStatement(true, null);
|
||||||
},
|
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().appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS);
|
this.appendDummyInput()
|
||||||
this.setInputsInline(true);
|
.appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS);
|
||||||
this.setPreviousStatement(true, null);
|
this.setInputsInline(true);
|
||||||
this.setNextStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP);
|
this.setNextStatement(true, null);
|
||||||
},
|
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().appendField(Blockly.Msg.ARD_TIME_MILLIS);
|
this.appendDummyInput()
|
||||||
this.setOutput(true, Types.LARGE_NUMBER.typeName);
|
.appendField(Blockly.Msg.ARD_TIME_MILLIS);
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
|
this.setOutput(true, Types.LARGE_NUMBER.typeId);
|
||||||
},
|
this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP);
|
||||||
/** @return {string} The type of return value for the block, an integer. */
|
},
|
||||||
getBlockType: function () {
|
/** @return {string} The type of return value for the block, an integer. */
|
||||||
return Blockly.Types.LARGE_NUMBER;
|
getBlockType: function () {
|
||||||
},
|
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().appendField(Blockly.Msg.ARD_TIME_MICROS);
|
this.appendDummyInput()
|
||||||
this.setOutput(true, Types.LARGE_NUMBER.typeName);
|
.appendField(Blockly.Msg.ARD_TIME_MICROS);
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP);
|
this.setOutput(true, Types.LARGE_NUMBER.typeId);
|
||||||
},
|
this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP);
|
||||||
/**
|
},
|
||||||
* Should be a long (32bit), but for for now an int.
|
/**
|
||||||
* @return {string} The type of return value for the block, an integer.
|
* Should be a long (32bit), but for for now an int.
|
||||||
*/
|
* @return {string} The type of return value for the block, an integer.
|
||||||
getBlockType: function () {
|
*/
|
||||||
return Types.LARGE_NUMBER;
|
getBlockType: function () {
|
||||||
},
|
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().appendField(Blockly.Msg.ARD_TIME_INF);
|
this.appendDummyInput()
|
||||||
this.setInputsInline(true);
|
.appendField(Blockly.Msg.ARD_TIME_INF);
|
||||||
this.setPreviousStatement(true);
|
this.setInputsInline(true);
|
||||||
this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP);
|
this.setPreviousStatement(true);
|
||||||
},
|
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().appendField(Blockly.Msg.senseBox_interval_timer);
|
this.appendDummyInput()
|
||||||
// this.appendDummyInput()
|
.appendField(Blockly.Msg.senseBox_interval_timer);
|
||||||
// .setAlign(Blockly.ALIGN_LEFT)
|
this.appendDummyInput()
|
||||||
// .appendField(new Blockly.FieldTextInput("10000"), "interval")
|
.setAlign(Blockly.ALIGN_LEFT)
|
||||||
// .appendField(Blockly.Msg.senseBox_interval);
|
.appendField(new Blockly.FieldTextInput("10000"), "interval")
|
||||||
// this.appendStatementInput("DO").setCheck(null);
|
.appendField(Blockly.Msg.senseBox_interval);
|
||||||
// this.setPreviousStatement(true, null);
|
this.appendStatementInput('DO')
|
||||||
// this.setNextStatement(true, null);
|
.setCheck(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);
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,46 +1,43 @@
|
|||||||
import Blockly from "blockly/core";
|
import Blockly from 'blockly/core';
|
||||||
import { getColour } from "../helpers/colour";
|
import { getColour } from '../helpers/colour';
|
||||||
import { getCompatibleTypes } from "../helpers/types";
|
import { getCompatibleTypes } from '../helpers/types'
|
||||||
|
|
||||||
Blockly.Blocks["variables_set_dynamic"] = {
|
|
||||||
init: function () {
|
|
||||||
// const type = myVar.type;
|
|
||||||
this.setColour(getColour().variables);
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
this.appendValueInput("VALUE")
|
|
||||||
.appendField("set", "set")
|
|
||||||
.appendField("", "type")
|
|
||||||
.appendField(new Blockly.FieldVariable("VAR"), "VAR")
|
|
||||||
.appendField("to");
|
|
||||||
},
|
|
||||||
onchange: function (e) {
|
|
||||||
let variableID = this.getFieldValue("VAR");
|
|
||||||
let variable = Blockly.getMainWorkspace()
|
|
||||||
.getVariableMap()
|
|
||||||
.getVariableById(variableID);
|
|
||||||
if (variable !== null) {
|
|
||||||
this.getField("type").setValue(variable.type);
|
|
||||||
this.getInput("VALUE").setCheck(getCompatibleTypes(variable.type));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks["variables_get_dynamic"] = {
|
Blockly.Blocks['variables_set_dynamic'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.setColour(getColour().variables);
|
|
||||||
this.appendDummyInput()
|
// const type = myVar.type;
|
||||||
.appendField("", "type")
|
this.setColour(getColour().variables);
|
||||||
.appendField(new Blockly.FieldVariable("VAR"), "VAR");
|
this.setPreviousStatement(true, null);
|
||||||
this.setOutput(true);
|
this.setNextStatement(true, null);
|
||||||
},
|
this.appendValueInput('VALUE')
|
||||||
onchange: function (e) {
|
.appendField('set', 'set')
|
||||||
let variableID = this.getFieldValue("VAR");
|
.appendField('', 'type')
|
||||||
let variable = Blockly.getMainWorkspace()
|
.appendField(new Blockly.FieldVariable('VAR'), 'VAR')
|
||||||
.getVariableMap()
|
.appendField('to');
|
||||||
.getVariableById(variableID);
|
},
|
||||||
if (variable !== null) {
|
onchange: function (e) {
|
||||||
this.getField("type").setValue(variable.type);
|
let variableID = this.getFieldValue('VAR');
|
||||||
|
let variable = Blockly.getMainWorkspace().getVariableMap().getVariableById(variableID)
|
||||||
|
this.getField('type').setValue(variable.type);
|
||||||
|
this.getInput('VALUE').setCheck(getCompatibleTypes(variable.type));
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
};
|
|
||||||
|
Blockly.Blocks['variables_get_dynamic'] = {
|
||||||
|
init: function () {
|
||||||
|
this.setColour(getColour().variables);
|
||||||
|
this.appendDummyInput()
|
||||||
|
.appendField('', 'type')
|
||||||
|
.appendField(new Blockly.FieldVariable('VAR'), 'VAR');
|
||||||
|
this.setOutput(true);
|
||||||
|
},
|
||||||
|
onchange: function (e) {
|
||||||
|
let variableID = this.getFieldValue('VAR');
|
||||||
|
let variable = Blockly.getMainWorkspace().getVariableMap().getVariableById(variableID)
|
||||||
|
this.getField('type').setValue(variable.type);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
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("");
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,334 +0,0 @@
|
|||||||
import Blockly from 'blockly/core';
|
|
||||||
import { getColour } from '../helpers/colour';
|
|
||||||
import { getCompatibleTypes } from '../helpers/types'
|
|
||||||
import * as Types from '../helpers/types';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Webserver Blocks By Lucas Steinmann
|
|
||||||
* */
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_initialize_http_server'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_init_http_server_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_init_http_server);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField("Port")
|
|
||||||
.appendField(new Blockly.FieldNumber(80), "Port");
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
},
|
|
||||||
onchange: function (e) {
|
|
||||||
// Is the block nested in a loop?
|
|
||||||
var block = this;
|
|
||||||
do {
|
|
||||||
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
block = block.getSurroundParent();
|
|
||||||
} while (block);
|
|
||||||
},
|
|
||||||
LOOP_TYPES: ['arduino_functions'],
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_http_on_client_connect'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_on_client_connect_tip);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_http_on_client_connect);
|
|
||||||
this.appendStatementInput('ON_CONNECT');
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_http_method'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_method)
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_method_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
},
|
|
||||||
getBlockType: function () {
|
|
||||||
return Blockly.Types.TEXT;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_http_uri'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_uri)
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_uri_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_http_protocol_version'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_protocol_version)
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_protocol_version_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_ip_address'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_ip_address);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_ip_address_tip);
|
|
||||||
this.setHelpUrl('');
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_http_user_agent'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_user_agent)
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_user_agent_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_generate_html_doc'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_html_document);
|
|
||||||
this.appendValueInput('HEADER')
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.setCheck(getCompatibleTypes('String'))
|
|
||||||
.appendField(Blockly.Msg.senseBox_html_header);
|
|
||||||
this.appendValueInput('BODY')
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.setCheck(getCompatibleTypes('String'))
|
|
||||||
.appendField(Blockly.Msg.senseBox_html_body);
|
|
||||||
this.setInputsInline(false);
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_html_document_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_generate_http_succesful_response'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_success);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_success_l2);
|
|
||||||
this.appendValueInput('CONTENT')
|
|
||||||
.appendField(Blockly.Msg.senseBox_http_success_buildhtml)
|
|
||||||
.setCheck(getCompatibleTypes('String'));
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_success_tip);
|
|
||||||
this.setInputsInline(false);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_generate_http_not_found_response'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput().appendField(Blockly.Msg.senseBox_http_not_found);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_http_not_found_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
this.setPreviousStatement(true, null);
|
|
||||||
this.setNextStatement(true, null);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_general_html_tag'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_html_general_tag_tip);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField("<")
|
|
||||||
.appendField(new Blockly.FieldTextInput("Tag"), "TAG")
|
|
||||||
.appendField(">");
|
|
||||||
this.appendValueInput('DO0')
|
|
||||||
.setCheck(getCompatibleTypes('String'));
|
|
||||||
this.setInputsInline(false);
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
this.setPreviousStatement(false);
|
|
||||||
this.setNextStatement(false);
|
|
||||||
this.setMutator(new Blockly.Mutator(['additional_child']));
|
|
||||||
this.additionalChildCount_ = 0;
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Create XML to represent the number of else-if and else inputs.
|
|
||||||
* @return {Element} XML storage element.
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
mutationToDom: function () {
|
|
||||||
if (!this.additionalChildCount_) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
var container = document.createElement('mutation');
|
|
||||||
if (this.additionalChildCount_) {
|
|
||||||
container.setAttribute('add_child', this.additionalChildCount_);
|
|
||||||
}
|
|
||||||
return container;
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Parse XML to restore the else-if and else inputs.
|
|
||||||
* @param {!Element} xmlElement XML storage element.
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
domToMutation: function (xmlElement) {
|
|
||||||
this.additionalChildCount_ = parseInt(xmlElement.getAttribute('add_child'), 10) || 0;
|
|
||||||
this.updateShape_();
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Populate the mutator's dialog with this block's components.
|
|
||||||
* @param {!Blockly.Workspace} workspace Mutator's workspace.
|
|
||||||
* @return {!Blockly.Block} Root block in mutator.
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
decompose: function (workspace) {
|
|
||||||
var containerBlock = workspace.newBlock('first_child');
|
|
||||||
containerBlock.initSvg();
|
|
||||||
var connection = containerBlock.nextConnection;
|
|
||||||
for (var i = 1; i <= this.additionalChildCount_; i++) {
|
|
||||||
var elseifBlock = workspace.newBlock('additional_child');
|
|
||||||
elseifBlock.initSvg();
|
|
||||||
connection.connect(elseifBlock.previousConnection);
|
|
||||||
connection = elseifBlock.nextConnection;
|
|
||||||
}
|
|
||||||
return containerBlock;
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Reconfigure this block based on the mutator dialog's components.
|
|
||||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
compose: function (containerBlock) {
|
|
||||||
var clauseBlock = containerBlock.nextConnection.targetBlock();
|
|
||||||
// Count number of inputs.
|
|
||||||
this.additionalChildCount_ = 0;
|
|
||||||
var statementConnections = [null];
|
|
||||||
while (clauseBlock) {
|
|
||||||
switch (clauseBlock.type) {
|
|
||||||
case 'additional_child':
|
|
||||||
this.additionalChildCount_++;
|
|
||||||
statementConnections.push(clauseBlock.statementConnection_);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error("Unknown block type.");
|
|
||||||
}
|
|
||||||
clauseBlock = clauseBlock.nextConnection &&
|
|
||||||
clauseBlock.nextConnection.targetBlock();
|
|
||||||
}
|
|
||||||
this.updateShape_();
|
|
||||||
// Reconnect any child blocks.
|
|
||||||
for (var i = 1; i <= this.additionalChildCount_; i++) {
|
|
||||||
Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Store pointers to any connected child blocks.
|
|
||||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
saveConnections: function (containerBlock) {
|
|
||||||
var clauseBlock = containerBlock.nextConnection.targetBlock();
|
|
||||||
var i = 1;
|
|
||||||
while (clauseBlock) {
|
|
||||||
switch (clauseBlock.type) {
|
|
||||||
case 'additional_child':
|
|
||||||
var inputDo = this.getInput('DO' + i);
|
|
||||||
clauseBlock.statementConnection_ =
|
|
||||||
inputDo && inputDo.connection.targetConnection;
|
|
||||||
i++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error('Unknown block type.');
|
|
||||||
}
|
|
||||||
clauseBlock = clauseBlock.nextConnection &&
|
|
||||||
clauseBlock.nextConnection.targetBlock();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Modify this block to have the correct number of inputs.
|
|
||||||
* @private
|
|
||||||
* @this Blockly.Block
|
|
||||||
*/
|
|
||||||
updateShape_: function () {
|
|
||||||
// Delete everything.
|
|
||||||
var i = 1;
|
|
||||||
while (this.getInput('DO' + i)) {
|
|
||||||
this.removeInput('DO' + i);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
// Rebuild block.
|
|
||||||
for (i = 1; i <= this.additionalChildCount_; i++) {
|
|
||||||
this.appendValueInput('DO' + i, Blockly.Arduino.ORDER_NONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Blocks['first_child'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField("<Tag>");
|
|
||||||
this.setNextStatement(true);
|
|
||||||
this.setInputsInline(true);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_tag_first_mutator_tip);
|
|
||||||
this.contextMenu = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Blocks['additional_child'] = {
|
|
||||||
init: function () {
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField("<Tag>");
|
|
||||||
this.setPreviousStatement(true);
|
|
||||||
this.setInputsInline(true);
|
|
||||||
this.setNextStatement(true);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_tag_optional_mutator_tip);
|
|
||||||
this.contextMenu = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Additional Webserver Blocks
|
|
||||||
|
|
||||||
Blockly.Blocks['sensebox_web_readHTML'] = {
|
|
||||||
init: function () {
|
|
||||||
this.appendDummyInput()
|
|
||||||
.appendField(Blockly.Msg.senseBox_sd_web_readHTML)
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT);
|
|
||||||
this.appendDummyInput()
|
|
||||||
.setAlign(Blockly.ALIGN_LEFT)
|
|
||||||
.appendField(Blockly.Msg.sensebox_web_readHTML_filename)
|
|
||||||
.appendField(new Blockly.FieldTextInput("index.txt"), "FILENAME");
|
|
||||||
this.setOutput(true, Types.TEXT.typeName);
|
|
||||||
this.setColour(getColour().webserver);
|
|
||||||
this.setTooltip(Blockly.Msg.senseBox_output_safetosd_tip);
|
|
||||||
this.setHelpUrl('https://sensebox.de/books');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -24,24 +24,13 @@
|
|||||||
// More on generating code:
|
// More on generating code:
|
||||||
// https://developers.google.com/blockly/guides/create-custom-blocks/generating-code
|
// https://developers.google.com/blockly/guides/create-custom-blocks/generating-code
|
||||||
|
|
||||||
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
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"] = new Blockly.Generator("Arduino");
|
Blockly['Arduino'] = new Blockly.Generator('Arduino');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of illegal variable names.
|
* List of illegal variable names.
|
||||||
@@ -50,44 +39,49 @@ Blockly["Arduino"] = new Blockly.Generator("Arduino");
|
|||||||
* accidentally clobbering a built-in object or function.
|
* accidentally clobbering a built-in object or function.
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].addReservedWords(
|
Blockly['Arduino'].addReservedWords(
|
||||||
// http://arduino.cc/en/Reference/HomePage
|
// http://arduino.cc/en/Reference/HomePage
|
||||||
"setup,loop,if,else,for,switch,case,while," +
|
'setup,loop,if,else,for,switch,case,while,' +
|
||||||
"do,break,continue,return,goto,define,include," +
|
'do,break,continue,return,goto,define,include,' +
|
||||||
"HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false," +
|
'HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,' +
|
||||||
"interger, constants,floating,point,void,boolean,char," +
|
'interger, constants,floating,point,void,bookean,char,' +
|
||||||
"unsigned,byte,int,word,long,float,double,string,String,array," +
|
'unsigned,byte,int,word,long,float,double,string,String,array,' +
|
||||||
"static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead," +
|
'static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead,' +
|
||||||
"analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn," +
|
'analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn,' +
|
||||||
"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,short,isBtnPressed"
|
'bit,attachInterrupt,detachInterrupt,interrupts,noInterrupts',
|
||||||
|
'short',
|
||||||
|
'isBtnPressed'
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Order of operation ENUMs.
|
* Order of operation ENUMs.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].ORDER_ATOMIC = 0; // 0 "" ...
|
Blockly['Arduino'].ORDER_ATOMIC = 0; // 0 "" ...
|
||||||
Blockly["Arduino"].ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] .
|
Blockly['Arduino'].ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] .
|
||||||
Blockly["Arduino"].ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr
|
Blockly['Arduino'].ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr
|
||||||
Blockly["Arduino"].ORDER_MULTIPLICATIVE = 3; // * / % ~/
|
Blockly['Arduino'].ORDER_MULTIPLICATIVE = 3; // * / % ~/
|
||||||
Blockly["Arduino"].ORDER_ADDITIVE = 4; // + -
|
Blockly['Arduino'].ORDER_ADDITIVE = 4; // + -
|
||||||
Blockly["Arduino"].ORDER_LOGICAL_NOT = 4.4; // !
|
Blockly['Arduino'].ORDER_LOGICAL_NOT = 4.4; // !
|
||||||
Blockly["Arduino"].ORDER_SHIFT = 5; // << >>
|
Blockly['Arduino'].ORDER_SHIFT = 5; // << >>
|
||||||
Blockly["Arduino"].ORDER_MODULUS = 5.3; // %
|
Blockly['Arduino'].ORDER_MODULUS = 5.3; // %
|
||||||
Blockly["Arduino"].ORDER_RELATIONAL = 6; // is is! >= > <= <
|
Blockly['Arduino'].ORDER_RELATIONAL = 6; // is is! >= > <= <
|
||||||
Blockly["Arduino"].ORDER_EQUALITY = 7; // === !== === !==
|
Blockly['Arduino'].ORDER_EQUALITY = 7; // === !== === !==
|
||||||
Blockly["Arduino"].ORDER_BITWISE_AND = 8; // &
|
Blockly['Arduino'].ORDER_BITWISE_AND = 8; // &
|
||||||
Blockly["Arduino"].ORDER_BITWISE_XOR = 9; // ^
|
Blockly['Arduino'].ORDER_BITWISE_XOR = 9; // ^
|
||||||
Blockly["Arduino"].ORDER_BITWISE_OR = 10; // |
|
Blockly['Arduino'].ORDER_BITWISE_OR = 10; // |
|
||||||
Blockly["Arduino"].ORDER_LOGICAL_AND = 11; // &&
|
Blockly['Arduino'].ORDER_LOGICAL_AND = 11; // &&
|
||||||
Blockly["Arduino"].ORDER_LOGICAL_OR = 12; // ||
|
Blockly['Arduino'].ORDER_LOGICAL_OR = 12; // ||
|
||||||
Blockly["Arduino"].ORDER_CONDITIONAL = 13; // expr ? expr : expr
|
Blockly['Arduino'].ORDER_CONDITIONAL = 13; // expr ? expr : expr
|
||||||
Blockly["Arduino"].ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |=
|
Blockly['Arduino'].ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |=
|
||||||
Blockly["Arduino"].ORDER_COMMA = 18; // ,
|
Blockly['Arduino'].ORDER_COMMA = 18; // ,
|
||||||
Blockly["Arduino"].ORDER_NONE = 99; // (...)
|
Blockly['Arduino'].ORDER_NONE = 99; // (...)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -96,105 +90,102 @@ Blockly["Arduino"].ORDER_NONE = 99; // (...)
|
|||||||
* Blockly Types
|
* Blockly Types
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialise the database of variable names.
|
* Initialise the database of variable names.
|
||||||
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
|
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].init = function (workspace) {
|
Blockly['Arduino'].init = function (workspace) {
|
||||||
// Create a dictionary of definitions to be printed before the code.
|
// Create a dictionary of definitions to be printed before the code.
|
||||||
Blockly["Arduino"].libraries_ = Object.create(null);
|
Blockly['Arduino'].libraries_ = Object.create(null);
|
||||||
|
|
||||||
Blockly["Arduino"].definitions_ = Object.create(null);
|
Blockly['Arduino'].definitions_ = Object.create(null);
|
||||||
|
|
||||||
// creates a list of code to be setup before the setup block
|
// creates a list of code to be setup before the setup block
|
||||||
Blockly["Arduino"].setupCode_ = Object.create(null);
|
Blockly['Arduino'].setupCode_ = Object.create(null);
|
||||||
|
|
||||||
// creates a list of code to be setup before the setup block
|
// creates a list of code for the loop to be runned once
|
||||||
Blockly["Arduino"].phyphoxSetupCode_ = Object.create(null);
|
Blockly['Arduino'].loopCodeOnce_ = Object.create(null)
|
||||||
|
|
||||||
// creates a list of code to be setup before the setup block
|
// creates a list of code for the loop to be runned once
|
||||||
Blockly["Arduino"].loraSetupCode_ = Object.create(null);
|
Blockly['Arduino'].codeFunctions_ = Object.create(null)
|
||||||
|
|
||||||
// creates a list of code for the loop to be runned once
|
// creates a list of code variables
|
||||||
Blockly["Arduino"].loopCodeOnce_ = Object.create(null);
|
Blockly['Arduino'].variables_ = Object.create(null)
|
||||||
|
|
||||||
// creates a list of code for the loop to be runned once
|
// Create a dictionary mapping desired function names in definitions_
|
||||||
Blockly["Arduino"].codeFunctions_ = Object.create(null);
|
// to actual function names (to avoid collisions with user functions).
|
||||||
|
Blockly['Arduino'].functionNames_ = Object.create(null);
|
||||||
|
|
||||||
// creates a list of code variables
|
Blockly['Arduino'].variablesInitCode_ = '';
|
||||||
Blockly["Arduino"].variables_ = Object.create(null);
|
|
||||||
|
|
||||||
// Create a dictionary mapping desired function names in definitions_
|
if (!Blockly['Arduino'].variableDB_) {
|
||||||
// to actual function names (to avoid collisions with user functions).
|
Blockly['Arduino'].variableDB_ = new Blockly.Names(
|
||||||
Blockly["Arduino"].functionNames_ = Object.create(null);
|
Blockly['Arduino'].RESERVED_WORDS_
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
Blockly['Arduino'].variableDB_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
Blockly["Arduino"].variablesInitCode_ = "";
|
Blockly['Arduino'].variableDB_.setVariableMap(workspace.getVariableMap());
|
||||||
|
|
||||||
if (!Blockly["Arduino"].nameDB_) {
|
// We don't have developer variables for now
|
||||||
Blockly["Arduino"].nameDB_ = new Blockly.Names(
|
// // Add developer variables (not created or named by the user).
|
||||||
Blockly["Arduino"].RESERVED_WORDS_
|
// var devVarList = Blockly.Variables.allDeveloperVariables(workspace);
|
||||||
);
|
// for (var i = 0; i < devVarList.length; i++) {
|
||||||
} else {
|
// defvars.push(Blockly['Arduino'].variableDB_.getName(devVarList[i],
|
||||||
Blockly["Arduino"].nameDB_.reset();
|
// Blockly.Names.DEVELOPER_VARIABLE_TYPE));
|
||||||
}
|
// }
|
||||||
|
|
||||||
Blockly["Arduino"].nameDB_.setVariableMap(workspace.getVariableMap());
|
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';
|
||||||
|
}
|
||||||
|
|
||||||
// We don't have developer variables for now
|
const stringVariables = workspace.getVariablesOfType('String');
|
||||||
// // Add developer variables (not created or named by the user).
|
for (i = 0; i < stringVariables.length; i += 1) {
|
||||||
// var devVarList = Blockly.Variables.allDeveloperVariables(workspace);
|
variableCode +=
|
||||||
// for (var i = 0; i < devVarList.length; i++) {
|
'String ' +
|
||||||
// defvars.push(Blockly['Arduino'].nameDB_.getName(devVarList[i],
|
Blockly['Arduino'].variableDB_.getName(
|
||||||
// Blockly.Names.DEVELOPER_VARIABLE_TYPE));
|
stringVariables[i].getId(),
|
||||||
// }
|
Blockly.Variables.NAME_TYPE
|
||||||
|
) +
|
||||||
|
' = ""; \n\n';
|
||||||
|
}
|
||||||
|
|
||||||
const doubleVariables = workspace.getVariablesOfType("Number");
|
const booleanVariables = workspace.getVariablesOfType('Boolean');
|
||||||
let i = 0;
|
for (i = 0; i < booleanVariables.length; i += 1) {
|
||||||
let variableCode = "";
|
variableCode +=
|
||||||
for (i = 0; i < doubleVariables.length; i += 1) {
|
'boolean ' +
|
||||||
variableCode +=
|
Blockly['Arduino'].variableDB_.getDistinctName(
|
||||||
"double " +
|
booleanVariables[i].getId(),
|
||||||
Blockly["Arduino"].nameDB_.getName(
|
Blockly.Variables.NAME_TYPE
|
||||||
doubleVariables[i].getId(),
|
) +
|
||||||
Blockly.Variables.NAME_TYPE
|
' = false; \n\n';
|
||||||
) +
|
}
|
||||||
" = 0; \n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
const stringVariables = workspace.getVariablesOfType("String");
|
const colourVariables = workspace.getVariablesOfType('Colour');
|
||||||
for (i = 0; i < stringVariables.length; i += 1) {
|
for (i = 0; i < colourVariables.length; i += 1) {
|
||||||
variableCode +=
|
variableCode +=
|
||||||
"String " +
|
'RGB ' +
|
||||||
Blockly["Arduino"].nameDB_.getName(
|
Blockly['Arduino'].variableDB_.getName(
|
||||||
stringVariables[i].getId(),
|
colourVariables[i].getId(),
|
||||||
Blockly.Variables.NAME_TYPE
|
Blockly.Variables.NAME_TYPE
|
||||||
) +
|
) +
|
||||||
' = ""; \n\n';
|
' = {0, 0, 0}; \n\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
const booleanVariables = workspace.getVariablesOfType("Boolean");
|
Blockly['Arduino'].variablesInitCode_ = variableCode;
|
||||||
for (i = 0; i < booleanVariables.length; i += 1) {
|
|
||||||
variableCode +=
|
|
||||||
"boolean " +
|
|
||||||
Blockly["Arduino"].nameDB_.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"].nameDB_.getName(
|
|
||||||
colourVariables[i].getId(),
|
|
||||||
Blockly.Variables.NAME_TYPE
|
|
||||||
) +
|
|
||||||
" = {0, 0, 0}; \n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
Blockly["Arduino"].variablesInitCode_ = variableCode;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -202,120 +193,81 @@ Blockly["Arduino"].init = function (workspace) {
|
|||||||
* @param {string} code Generated code.
|
* @param {string} code Generated code.
|
||||||
* @return {string} Completed code.
|
* @return {string} Completed code.
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].finish = function (code) {
|
Blockly['Arduino'].finish = function (code) {
|
||||||
let libraryCode = "";
|
let libraryCode = '';
|
||||||
let variablesCode = "";
|
let variablesCode = '';
|
||||||
let codeFunctions = "";
|
let codeFunctions = '';
|
||||||
let functionsCode = "";
|
let functionsCode = '';
|
||||||
let definitionsCode = "";
|
let definitionsCode = '';
|
||||||
let phyphoxSetupCode = "";
|
let loopCodeOnce = '';
|
||||||
let loopCodeOnce = "";
|
let setupCode = '';
|
||||||
let setupCode = "";
|
let preSetupCode = '';
|
||||||
let preSetupCode = "";
|
let devVariables = '\n';
|
||||||
let loraSetupCode = "";
|
|
||||||
let devVariables = "\n";
|
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].libraries_) {
|
for (const key in Blockly['Arduino'].libraries_) {
|
||||||
libraryCode += Blockly["Arduino"].libraries_[key] + "\n";
|
libraryCode += Blockly['Arduino'].libraries_[key] + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].variables_) {
|
for (const key in Blockly['Arduino'].variables_) {
|
||||||
variablesCode += Blockly["Arduino"].variables_[key] + "\n";
|
variablesCode += Blockly['Arduino'].variables_[key] + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].definitions_) {
|
for (const key in Blockly['Arduino'].definitions_) {
|
||||||
definitionsCode += Blockly["Arduino"].definitions_[key] + "\n";
|
definitionsCode += Blockly['Arduino'].definitions_[key] + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].loopCodeOnce_) {
|
for (const key in Blockly['Arduino'].loopCodeOnce_) {
|
||||||
loopCodeOnce += Blockly["Arduino"].loopCodeOnce_[key] + "\n";
|
loopCodeOnce += Blockly['Arduino'].loopCodeOnce_[key] + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].codeFunctions_) {
|
for (const key in Blockly['Arduino'].codeFunctions_) {
|
||||||
codeFunctions += Blockly["Arduino"].codeFunctions_[key] + "\n";
|
codeFunctions += Blockly['Arduino'].codeFunctions_[key] + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].functionNames_) {
|
for (const key in Blockly['Arduino'].functionNames_) {
|
||||||
functionsCode += Blockly["Arduino"].functionNames_[key] + "\n";
|
functionsCode += Blockly['Arduino'].functionNames_[key] + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].setupCode_) {
|
|
||||||
preSetupCode += Blockly["Arduino"].setupCode_[key] + "\n" || "";
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const key in Blockly["Arduino"].loraSetupCode_) {
|
|
||||||
loraSetupCode += Blockly["Arduino"].loraSetupCode_[key] + "\n" || "";
|
|
||||||
}
|
|
||||||
|
|
||||||
setupCode =
|
for (const key in Blockly['Arduino'].setupCode_) {
|
||||||
"\nvoid setup() { \n" + preSetupCode + "\n" + loraSetupCode + "\n}\n";
|
preSetupCode += Blockly['Arduino'].setupCode_[key] || '';
|
||||||
for (const key in Blockly["Arduino"].phyphoxSetupCode_) {
|
}
|
||||||
phyphoxSetupCode += Blockly["Arduino"].phyphoxSetupCode_[key] + "\n" || "";
|
setupCode = '\nvoid setup() { \n' + preSetupCode + '\n}\n';
|
||||||
}
|
|
||||||
|
let loopCode = '\nvoid loop() { \n' + loopCodeOnce + code + '\n}\n';
|
||||||
|
|
||||||
setupCode =
|
|
||||||
"\nvoid setup() { \n" +
|
|
||||||
preSetupCode +
|
|
||||||
"\n" +
|
|
||||||
phyphoxSetupCode +
|
|
||||||
"\n" +
|
|
||||||
loraSetupCode +
|
|
||||||
"\n}\n";
|
|
||||||
|
|
||||||
let loopCode = "\nvoid loop() { \n" + loopCodeOnce + code + "\n}\n";
|
|
||||||
// only add OTA code if tablet mode is enabled
|
|
||||||
if (ota === true) {
|
|
||||||
code =
|
|
||||||
devVariables +
|
|
||||||
"\n" +
|
|
||||||
"#include <SenseBoxOTA.h>" +
|
|
||||||
"\n" +
|
|
||||||
libraryCode +
|
|
||||||
"\n" +
|
|
||||||
variablesCode +
|
|
||||||
"\n" +
|
|
||||||
definitionsCode +
|
|
||||||
"\n" +
|
|
||||||
codeFunctions +
|
|
||||||
"\n" +
|
|
||||||
Blockly["Arduino"].variablesInitCode_ +
|
|
||||||
"\n" +
|
|
||||||
functionsCode +
|
|
||||||
"\n" +
|
|
||||||
setupCode +
|
|
||||||
"\n" +
|
|
||||||
loopCode;
|
|
||||||
} else {
|
|
||||||
// Convert the definitions dictionary into a list.
|
// Convert the definitions dictionary into a list.
|
||||||
code =
|
code =
|
||||||
devVariables +
|
devVariables +
|
||||||
"\n" +
|
'\n' +
|
||||||
libraryCode +
|
libraryCode +
|
||||||
"\n" +
|
'\n' +
|
||||||
variablesCode +
|
variablesCode +
|
||||||
"\n" +
|
'\n' +
|
||||||
definitionsCode +
|
definitionsCode +
|
||||||
"\n" +
|
'\n' +
|
||||||
codeFunctions +
|
codeFunctions +
|
||||||
"\n" +
|
'\n' +
|
||||||
Blockly["Arduino"].variablesInitCode_ +
|
Blockly['Arduino'].variablesInitCode_ +
|
||||||
"\n" +
|
'\n' +
|
||||||
functionsCode +
|
functionsCode +
|
||||||
"\n" +
|
'\n' +
|
||||||
setupCode +
|
setupCode +
|
||||||
"\n" +
|
'\n' +
|
||||||
loopCode;
|
loopCode
|
||||||
}
|
;
|
||||||
|
|
||||||
// Clean up temporary data.
|
// Clean up temporary data.
|
||||||
delete Blockly["Arduino"].definitions_;
|
delete Blockly['Arduino'].definitions_;
|
||||||
delete Blockly["Arduino"].functionNames_;
|
delete Blockly['Arduino'].functionNames_;
|
||||||
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"].nameDB_.reset();
|
Blockly['Arduino'].variableDB_.reset();
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -324,8 +276,8 @@ Blockly["Arduino"].finish = function (code) {
|
|||||||
* @param {string} line Line of generated code.
|
* @param {string} line Line of generated code.
|
||||||
* @return {string} Legal line of code.
|
* @return {string} Legal line of code.
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].scrubNakedValue = function (line) {
|
Blockly['Arduino'].scrubNakedValue = function (line) {
|
||||||
return line + ";\n";
|
return line + ';\n';
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -335,14 +287,14 @@ Blockly["Arduino"].scrubNakedValue = function (line) {
|
|||||||
* @return {string} Arduino string.
|
* @return {string} Arduino string.
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].quote_ = function (string) {
|
Blockly['Arduino'].quote_ = function (string) {
|
||||||
// Can't use goog.string.quote since Google's style guide recommends
|
// Can't use goog.string.quote since Google's style guide recommends
|
||||||
// JS string literals use single quotes.
|
// JS string literals use single quotes.
|
||||||
string = string
|
string = string
|
||||||
.replace(/\\/g, "\\\\")
|
.replace(/\\/g, '\\\\')
|
||||||
.replace(/\n/g, "\\\n")
|
.replace(/\n/g, '\\\n')
|
||||||
.replace(/'/g, "\\'");
|
.replace(/'/g, "\\'");
|
||||||
return '"' + string + '"';
|
return '"' + string + '"';
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -355,42 +307,43 @@ Blockly["Arduino"].quote_ = function (string) {
|
|||||||
* @return {string} Arduino code with comments and subsequent blocks added.
|
* @return {string} Arduino code with comments and subsequent blocks added.
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Blockly["Arduino"].scrub_ = function (block, code) {
|
Blockly['Arduino'].scrub_ = function (block, code) {
|
||||||
let commentCode = "";
|
let commentCode = '';
|
||||||
// Only collect comments for blocks that aren't inline.
|
// Only collect comments for blocks that aren't inline.
|
||||||
if (!block.outputConnection || !block.outputConnection.targetConnection) {
|
if (!block.outputConnection || !block.outputConnection.targetConnection) {
|
||||||
// Collect comment for this block.
|
// Collect comment for this block.
|
||||||
let comment = block.getCommentText();
|
let comment = block.getCommentText();
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
comment = comment
|
comment = comment ? Blockly.utils.string.wrap(
|
||||||
? Blockly.utils.string.wrap(comment, Blockly["Arduino"].COMMENT_WRAP - 3)
|
comment,
|
||||||
: null;
|
Blockly['Arduino'].COMMENT_WRAP - 3
|
||||||
if (comment) {
|
) : null;
|
||||||
if (block.getProcedureDef) {
|
if (comment) {
|
||||||
// Use a comment block for function comments.
|
if (block.getProcedureDef) {
|
||||||
commentCode +=
|
// Use a comment block for function comments.
|
||||||
"/**\n" +
|
commentCode +=
|
||||||
Blockly["Arduino"].prefixLines(comment + "\n", " * ") +
|
'/**\n' +
|
||||||
" */\n";
|
Blockly['Arduino'].prefixLines(comment + '\n', ' * ') +
|
||||||
} else {
|
' */\n';
|
||||||
commentCode += Blockly["Arduino"].prefixLines(comment + "\n", "// ");
|
} else {
|
||||||
}
|
commentCode += Blockly['Arduino'].prefixLines(comment + '\n', '// ');
|
||||||
}
|
}
|
||||||
// Collect comments for all value arguments.
|
}
|
||||||
// Don't collect comments for nested statements.
|
// Collect comments for all value arguments.
|
||||||
for (let i = 0; i < block.inputList.length; i++) {
|
// Don't collect comments for nested statements.
|
||||||
if (block.inputList[i].type === Blockly.INPUT_VALUE) {
|
for (let i = 0; i < block.inputList.length; i++) {
|
||||||
const childBlock = block.inputList[i].connection.targetBlock();
|
if (block.inputList[i].type === Blockly.INPUT_VALUE) {
|
||||||
if (childBlock) {
|
const childBlock = block.inputList[i].connection.targetBlock();
|
||||||
const comment = Blockly["Arduino"].allNestedComments(childBlock);
|
if (childBlock) {
|
||||||
if (comment) {
|
const comment = Blockly['Arduino'].allNestedComments(childBlock);
|
||||||
commentCode += Blockly["Arduino"].prefixLines(comment, "// ");
|
if (comment) {
|
||||||
}
|
commentCode += Blockly['Arduino'].prefixLines(comment, '// ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
|
||||||
const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
|
const nextCode = Blockly['Arduino'].blockToCode(nextBlock);
|
||||||
const nextCode = Blockly["Arduino"].blockToCode(nextBlock);
|
return commentCode + code + nextCode;
|
||||||
return commentCode + code + nextCode;
|
|
||||||
};
|
};
|
||||||
@@ -1,27 +1,21 @@
|
|||||||
import "./generator";
|
import './generator';
|
||||||
import "./loops";
|
import './loops';
|
||||||
import "./sensebox-sensors";
|
import './sensebox-sensors';
|
||||||
import "./sensebox-telegram";
|
import './sensebox-telegram';
|
||||||
import "./sensebox-osem";
|
import './sensebox-osem';
|
||||||
import "./sensebox-web";
|
import './sensebox-web';
|
||||||
import "./sensebox-display";
|
import './sensebox-display';
|
||||||
import "./sensebox-lora";
|
import './sensebox-lora';
|
||||||
import "./sensebox-led";
|
import './sensebox-led';
|
||||||
import "./sensebox";
|
import './sensebox-sd';
|
||||||
import "./sensebox-rtc";
|
import './logic';
|
||||||
import "./sensebox-ble";
|
import './text';
|
||||||
import "./sensebox-sd";
|
import './math';
|
||||||
import "./mqtt";
|
import './map';
|
||||||
import "./logic";
|
import './io';
|
||||||
import "./text";
|
import './audio';
|
||||||
import "./math";
|
import './procedures';
|
||||||
import "./map";
|
import './time';
|
||||||
import "./io";
|
import './variables';
|
||||||
import "./audio";
|
|
||||||
import "./procedures";
|
|
||||||
import "./serial";
|
|
||||||
import "./time";
|
|
||||||
import "./variables";
|
|
||||||
import "./lists";
|
|
||||||
import "./watchdog";
|
|
||||||
import "./webserver";
|
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
import * as Blockly from 'blockly/core';
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Arduino['lists_create_empty'] = function () {
|
|
||||||
var code = '';
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
}
|
|
||||||
|
|
||||||
Blockly.Arduino['array_getIndex'] = function () {
|
|
||||||
var code = '';
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Arduino['lists_length'] = function () {
|
|
||||||
var array = Blockly.Arduino.valueToCode(this, 'ARRAY', Blockly.Arduino.ORDER_ATOMIC);
|
|
||||||
var code = `${array}.length`;
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
}
|
|
||||||
@@ -74,14 +74,14 @@ Blockly.Arduino['controls_if'] = function (Block) {
|
|||||||
conditionCode +
|
conditionCode +
|
||||||
') {\n' +
|
') {\n' +
|
||||||
branchCode +
|
branchCode +
|
||||||
'}\n';
|
'}';
|
||||||
|
|
||||||
++n;
|
++n;
|
||||||
} while (Block.getInput('IF' + n));
|
} while (Block.getInput('IF' + n));
|
||||||
|
|
||||||
if (Block.getInput('ELSE')) {
|
if (Block.getInput('ELSE')) {
|
||||||
branchCode = Blockly.Arduino.statementToCode(Block, 'ELSE');
|
branchCode = Blockly.Arduino.statementToCode(Block, 'ELSE');
|
||||||
code += ' else {\n' + branchCode + '}\n';
|
code += ' else {\n' + branchCode + '}';
|
||||||
}
|
}
|
||||||
return code + '\n';
|
return code + '\n';
|
||||||
};
|
};
|
||||||
@@ -106,14 +106,14 @@ Blockly.Arduino['controls_ifelse'] = function (Block) {
|
|||||||
conditionCode +
|
conditionCode +
|
||||||
') {\n' +
|
') {\n' +
|
||||||
branchCode +
|
branchCode +
|
||||||
'}\n';
|
'}';
|
||||||
|
|
||||||
++n;
|
++n;
|
||||||
} while (Block.getInput('IF' + n));
|
} while (Block.getInput('IF' + n));
|
||||||
|
|
||||||
if (Block.getInput('ELSE')) {
|
if (Block.getInput('ELSE')) {
|
||||||
branchCode = Blockly.Arduino.statementToCode(Block, 'ELSE');
|
branchCode = Blockly.Arduino.statementToCode(Block, 'ELSE');
|
||||||
code += ' else {\n' + branchCode + '}\n';
|
code += ' else {\n' + branchCode + '}';
|
||||||
}
|
}
|
||||||
return code + '\n';
|
return code + '\n';
|
||||||
}
|
}
|
||||||
@@ -127,6 +127,9 @@ Blockly.Arduino['logic_negate'] = function (Block) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Arduino['switch_case'] = function (block) {
|
Blockly.Arduino['switch_case'] = function (block) {
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var argument = Blockly.Arduino.valueToCode(this, 'CONDITION',
|
var argument = Blockly.Arduino.valueToCode(this, 'CONDITION',
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import * as Blockly from "blockly/core";
|
|
||||||
|
import * as Blockly from 'blockly/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @license Licensed under the Apache License, Version 2.0 (the "License"):
|
* @license Licensed under the Apache License, Version 2.0 (the "License"):
|
||||||
@@ -18,15 +19,15 @@ 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["math_number"] = function (block) {
|
Blockly.Arduino['math_number'] = function (block) {
|
||||||
// Numeric value.
|
// Numeric value.
|
||||||
var code = parseFloat(block.getFieldValue("NUM"));
|
var code = parseFloat(block.getFieldValue('NUM'));
|
||||||
if (code === Infinity) {
|
if (code === Infinity) {
|
||||||
code = "INFINITY";
|
code = 'INFINITY';
|
||||||
} else if (code === -Infinity) {
|
} else if (code === -Infinity) {
|
||||||
code = "-INFINITY";
|
code = '-INFINITY';
|
||||||
}
|
}
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,27 +37,27 @@ Blockly.Arduino["math_number"] = 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["math_arithmetic"] = function (block) {
|
Blockly.Arduino['math_arithmetic'] = function (block) {
|
||||||
var OPERATORS = {
|
var OPERATORS = {
|
||||||
ADD: [" + ", Blockly.Arduino.ORDER_ADDITIVE],
|
ADD: [' + ', Blockly.Arduino.ORDER_ADDITIVE],
|
||||||
MINUS: [" - ", Blockly.Arduino.ORDER_ADDITIVE],
|
MINUS: [' - ', Blockly.Arduino.ORDER_ADDITIVE],
|
||||||
MULTIPLY: [" * ", Blockly.Arduino.ORDER_MULTIPLICATIVE],
|
MULTIPLY: [' * ', Blockly.Arduino.ORDER_MULTIPLICATIVE],
|
||||||
DIVIDE: [" / ", Blockly.Arduino.ORDER_MULTIPLICATIVE],
|
DIVIDE: [' / ', Blockly.Arduino.ORDER_MULTIPLICATIVE],
|
||||||
POWER: [null, Blockly.Arduino.ORDER_NONE], // Handle power separately.
|
POWER: [null, Blockly.Arduino.ORDER_NONE] // Handle power separately.
|
||||||
};
|
};
|
||||||
var tuple = OPERATORS[block.getFieldValue("OP")];
|
var tuple = OPERATORS[block.getFieldValue('OP')];
|
||||||
var operator = tuple[0];
|
var operator = tuple[0];
|
||||||
var order = tuple[1];
|
var order = tuple[1];
|
||||||
var argument0 = Blockly.Arduino.valueToCode(block, "A", order) || "0";
|
var argument0 = Blockly.Arduino.valueToCode(block, 'A', order) || '0';
|
||||||
var argument1 = Blockly.Arduino.valueToCode(block, "B", order) || "0";
|
var argument1 = Blockly.Arduino.valueToCode(block, 'B', order) || '0';
|
||||||
var code;
|
var code;
|
||||||
// Power in C++ requires a special case since it has no operator.
|
// Power in C++ requires a special case since it has no operator.
|
||||||
if (!operator) {
|
if (!operator) {
|
||||||
code = "Math.pow(" + argument0 + ", " + argument1 + ")";
|
code = 'Math.pow(' + argument0 + ', ' + argument1 + ')';
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
}
|
}
|
||||||
code = argument0 + operator + argument1;
|
code = argument0 + operator + argument1;
|
||||||
return [code, order];
|
return [code, order];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,103 +66,90 @@ Blockly.Arduino["math_arithmetic"] = 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["math_single"] = function (block) {
|
Blockly.Arduino['math_single'] = function (block) {
|
||||||
var operator = block.getFieldValue("OP");
|
var operator = block.getFieldValue('OP');
|
||||||
var code;
|
var code;
|
||||||
var arg;
|
var arg;
|
||||||
if (operator === "NEG") {
|
if (operator === 'NEG') {
|
||||||
// Negation is a special case given its different operator precedents.
|
// Negation is a special case given its different operator precedents.
|
||||||
arg =
|
arg = Blockly.Arduino.valueToCode(block, 'NUM',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_UNARY_PREFIX) || '0';
|
||||||
block,
|
if (arg[0] === '-') {
|
||||||
"NUM",
|
// --3 is not legal in C++ in this context.
|
||||||
Blockly.Arduino.ORDER_UNARY_PREFIX
|
arg = ' ' + arg;
|
||||||
) || "0";
|
}
|
||||||
if (arg[0] === "-") {
|
code = '-' + arg;
|
||||||
// --3 is not legal in C++ in this context.
|
return [code, Blockly.Arduino.ORDER_UNARY_PREFIX];
|
||||||
arg = " " + arg;
|
|
||||||
}
|
}
|
||||||
code = "-" + arg;
|
if (operator === 'ABS' || operator.substring(0, 5) === 'ROUND') {
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_PREFIX];
|
arg = Blockly.Arduino.valueToCode(block, 'NUM',
|
||||||
}
|
Blockly.Arduino.ORDER_UNARY_POSTFIX) || '0';
|
||||||
if (operator === "ABS" || operator.substring(0, 5) === "ROUND") {
|
} else if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') {
|
||||||
arg =
|
arg = Blockly.Arduino.valueToCode(block, 'NUM',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0';
|
||||||
block,
|
} else {
|
||||||
"NUM",
|
arg = Blockly.Arduino.valueToCode(block, 'NUM',
|
||||||
Blockly.Arduino.ORDER_UNARY_POSTFIX
|
Blockly.Arduino.ORDER_NONE) || '0';
|
||||||
) || "0";
|
}
|
||||||
} else if (operator === "SIN" || operator === "COS" || operator === "TAN") {
|
// First, handle cases which generate values that don't need parentheses.
|
||||||
arg =
|
switch (operator) {
|
||||||
Blockly.Arduino.valueToCode(
|
case 'ABS':
|
||||||
block,
|
code = 'abs(' + arg + ')';
|
||||||
"NUM",
|
break;
|
||||||
Blockly.Arduino.ORDER_MULTIPLICATIVE
|
case 'ROOT':
|
||||||
) || "0";
|
code = 'sqrt(' + arg + ')';
|
||||||
} else {
|
break;
|
||||||
arg =
|
case 'LN':
|
||||||
Blockly.Arduino.valueToCode(block, "NUM", Blockly.Arduino.ORDER_NONE) ||
|
code = 'log(' + arg + ')';
|
||||||
"0";
|
break;
|
||||||
}
|
case 'EXP':
|
||||||
// First, handle cases which generate values that don't need parentheses.
|
code = 'exp(' + arg + ')';
|
||||||
switch (operator) {
|
break;
|
||||||
case "ABS":
|
case 'POW10':
|
||||||
code = "abs(" + arg + ")";
|
code = 'pow(10,' + arg + ')';
|
||||||
break;
|
break;
|
||||||
case "ROOT":
|
case 'ROUND':
|
||||||
code = "sqrt(" + arg + ")";
|
code = 'round(' + arg + ')';
|
||||||
break;
|
break;
|
||||||
case "LN":
|
case 'ROUNDUP':
|
||||||
code = "log(" + arg + ")";
|
code = 'ceil(' + arg + ')';
|
||||||
break;
|
break;
|
||||||
case "EXP":
|
case 'ROUNDDOWN':
|
||||||
code = "exp(" + arg + ")";
|
code = 'floor(' + arg + ')';
|
||||||
break;
|
break;
|
||||||
case "POW10":
|
case 'SIN':
|
||||||
code = "pow(10," + arg + ")";
|
code = 'sin(' + arg + ' / 180 * Math.PI)';
|
||||||
break;
|
break;
|
||||||
case "ROUND":
|
case 'COS':
|
||||||
code = "round(" + arg + ")";
|
code = 'cos(' + arg + ' / 180 * Math.PI)';
|
||||||
break;
|
break;
|
||||||
case "ROUNDUP":
|
case 'TAN':
|
||||||
code = "ceil(" + arg + ")";
|
code = 'tan(' + arg + ' / 180 * Math.PI)';
|
||||||
break;
|
break;
|
||||||
case "ROUNDDOWN":
|
default:
|
||||||
code = "floor(" + arg + ")";
|
break;
|
||||||
break;
|
}
|
||||||
case "SIN":
|
if (code) {
|
||||||
code = "sin(" + arg + " / 180 * Math.PI)";
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
break;
|
}
|
||||||
case "COS":
|
// Second, handle cases which generate values that may need parentheses.
|
||||||
code = "cos(" + arg + " / 180 * Math.PI)";
|
switch (operator) {
|
||||||
break;
|
case 'LOG10':
|
||||||
case "TAN":
|
code = 'log(' + arg + ') / log(10)';
|
||||||
code = "tan(" + arg + " / 180 * Math.PI)";
|
break;
|
||||||
break;
|
case 'ASIN':
|
||||||
default:
|
code = 'asin(' + arg + ') / M_PI * 180';
|
||||||
break;
|
break;
|
||||||
}
|
case 'ACOS':
|
||||||
if (code) {
|
code = 'acos(' + arg + ') / M_PI * 180';
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
break;
|
||||||
}
|
case 'ATAN':
|
||||||
// Second, handle cases which generate values that may need parentheses.
|
code = 'atan(' + arg + ') / M_PI * 180';
|
||||||
switch (operator) {
|
break;
|
||||||
case "LOG10":
|
default:
|
||||||
code = "log(" + arg + ") / log(10)";
|
throw new Error('Unknown math operator: ' + operator);
|
||||||
break;
|
}
|
||||||
case "ASIN":
|
return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE];
|
||||||
code = "asin(" + arg + ") / M_PI * 180";
|
|
||||||
break;
|
|
||||||
case "ACOS":
|
|
||||||
code = "acos(" + arg + ") / M_PI * 180";
|
|
||||||
break;
|
|
||||||
case "ATAN":
|
|
||||||
code = "atan(" + arg + ") / M_PI * 180";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error("Unknown math operator: " + operator);
|
|
||||||
}
|
|
||||||
return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -173,16 +161,16 @@ Blockly.Arduino["math_single"] = 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["math_constant"] = function (block) {
|
Blockly.Arduino['math_constant'] = function (block) {
|
||||||
var CONSTANTS = {
|
var CONSTANTS = {
|
||||||
PI: ["M_PI", Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
'PI': ['M_PI', Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
||||||
E: ["M_E", Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
'E': ['M_E', Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
||||||
GOLDEN_RATIO: ["(1 + sqrt(5)) / 2", Blockly.Arduino.ORDER_MULTIPLICATIVE],
|
'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', Blockly.Arduino.ORDER_MULTIPLICATIVE],
|
||||||
SQRT2: ["M_SQRT2", Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
'SQRT2': ['M_SQRT2', Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
||||||
SQRT1_2: ["M_SQRT1_2", Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
'SQRT1_2': ['M_SQRT1_2', Blockly.Arduino.ORDER_UNARY_POSTFIX],
|
||||||
INFINITY: ["INFINITY", Blockly.Arduino.ORDER_ATOMIC],
|
'INFINITY': ['INFINITY', Blockly.Arduino.ORDER_ATOMIC]
|
||||||
};
|
};
|
||||||
return CONSTANTS[block.getFieldValue("CONSTANT")];
|
return CONSTANTS[block.getFieldValue('CONSTANT')];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -192,72 +180,63 @@ Blockly.Arduino["math_constant"] = 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["math_number_property"] = function (block) {
|
Blockly.Arduino['math_number_property'] = function (block) {
|
||||||
var number_to_check =
|
var number_to_check = Blockly.Arduino.valueToCode(block, 'NUMBER_TO_CHECK',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0';
|
||||||
block,
|
var dropdown_property = block.getFieldValue('PROPERTY');
|
||||||
"NUMBER_TO_CHECK",
|
var code;
|
||||||
Blockly.Arduino.ORDER_MULTIPLICATIVE
|
if (dropdown_property === 'PRIME') {
|
||||||
) || "0";
|
var func = [
|
||||||
var dropdown_property = block.getFieldValue("PROPERTY");
|
'boolean ' + Blockly.Arduino.DEF_FUNC_NAME + '(int n) {',
|
||||||
var code;
|
' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
|
||||||
if (dropdown_property === "PRIME") {
|
' if (n == 2 || n == 3) {',
|
||||||
var func = [
|
' return true;',
|
||||||
"boolean " + Blockly.Arduino.DEF_FUNC_NAME + "(int n) {",
|
' }',
|
||||||
" // https://en.wikipedia.org/wiki/Primality_test#Naive_methods",
|
' // False if n is NaN, negative, is 1.',
|
||||||
" if (n == 2 || n == 3) {",
|
' // And false if n is divisible by 2 or 3.',
|
||||||
" return true;",
|
' if (isnan(n) || (n <= 1) || (n == 1) || (n % 2 == 0) || ' +
|
||||||
" }",
|
'(n % 3 == 0)) {',
|
||||||
" // False if n is NaN, negative, is 1.",
|
' return false;',
|
||||||
" // And false if n is divisible by 2 or 3.",
|
' }',
|
||||||
" if (isnan(n) || (n <= 1) || (n == 1) || (n % 2 == 0) || " +
|
' // Check all the numbers of form 6k +/- 1, up to sqrt(n).',
|
||||||
"(n % 3 == 0)) {",
|
' for (int x = 6; x <= sqrt(n) + 1; x += 6) {',
|
||||||
" return false;",
|
' if (n % (x - 1) == 0 || n % (x + 1) == 0) {',
|
||||||
" }",
|
' return false;',
|
||||||
" // Check all the numbers of form 6k +/- 1, up to sqrt(n).",
|
' }',
|
||||||
" for (int x = 6; x <= sqrt(n) + 1; x += 6) {",
|
' }',
|
||||||
" if (n % (x - 1) == 0 || n % (x + 1) == 0) {",
|
' return true;',
|
||||||
" return false;",
|
'}'];
|
||||||
" }",
|
var funcName = Blockly.Arduino.addFunction('mathIsPrime', func.join('\n'));
|
||||||
" }",
|
Blockly.Arduino.addInclude('math', '#include <math.h>');
|
||||||
" return true;",
|
code = funcName + '(' + number_to_check + ')';
|
||||||
"}",
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
];
|
}
|
||||||
var funcName = Blockly.Arduino.addFunction("mathIsPrime", func.join("\n"));
|
switch (dropdown_property) {
|
||||||
Blockly.Arduino.addInclude("math", "#include <math.h>");
|
case 'EVEN':
|
||||||
code = funcName + "(" + number_to_check + ")";
|
code = number_to_check + ' % 2 == 0';
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
break;
|
||||||
}
|
case 'ODD':
|
||||||
switch (dropdown_property) {
|
code = number_to_check + ' % 2 == 1';
|
||||||
case "EVEN":
|
break;
|
||||||
code = number_to_check + " % 2 == 0";
|
case 'WHOLE':
|
||||||
break;
|
Blockly.Arduino.addInclude('math', '#include <math.h>');
|
||||||
case "ODD":
|
code = '(floor(' + number_to_check + ') == ' + number_to_check + ')';
|
||||||
code = number_to_check + " % 2 == 1";
|
break;
|
||||||
break;
|
case 'POSITIVE':
|
||||||
case "WHOLE":
|
code = number_to_check + ' > 0';
|
||||||
Blockly.Arduino.addInclude("math", "#include <math.h>");
|
break;
|
||||||
code = "(floor(" + number_to_check + ") == " + number_to_check + ")";
|
case 'NEGATIVE':
|
||||||
break;
|
code = number_to_check + ' < 0';
|
||||||
case "POSITIVE":
|
break;
|
||||||
code = number_to_check + " > 0";
|
case 'DIVISIBLE_BY':
|
||||||
break;
|
var divisor = Blockly.Arduino.valueToCode(block, 'DIVISOR',
|
||||||
case "NEGATIVE":
|
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0';
|
||||||
code = number_to_check + " < 0";
|
code = number_to_check + ' % ' + divisor + ' == 0';
|
||||||
break;
|
break;
|
||||||
case "DIVISIBLE_BY":
|
default:
|
||||||
var divisor =
|
break;
|
||||||
Blockly.Arduino.valueToCode(
|
}
|
||||||
block,
|
return [code, Blockly.Arduino.ORDER_EQUALITY];
|
||||||
"DIVISOR",
|
|
||||||
Blockly.Arduino.ORDER_MULTIPLICATIVE
|
|
||||||
) || "0";
|
|
||||||
code = number_to_check + " % " + divisor + " == 0";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return [code, Blockly.Arduino.ORDER_EQUALITY];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -268,25 +247,19 @@ Blockly.Arduino["math_number_property"] = 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["math_change"] = function (block) {
|
Blockly.Arduino['math_change'] = function (block) {
|
||||||
var argument0 =
|
var argument0 = Blockly.Arduino.valueToCode(block, 'DELTA',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_ADDITIVE) || '0';
|
||||||
block,
|
var varName = Blockly.Arduino.variableDB_.getName(
|
||||||
"DELTA",
|
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
|
||||||
Blockly.Arduino.ORDER_ADDITIVE
|
return varName + ' += ' + argument0 + ';\n';
|
||||||
) || "0";
|
|
||||||
var varName = Blockly.Arduino.nameDB_.getName(
|
|
||||||
block.getFieldValue("VAR"),
|
|
||||||
Blockly.Variables.NAME_TYPE
|
|
||||||
);
|
|
||||||
return varName + " += " + argument0 + ";\n";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Rounding functions have a single operand. */
|
/** Rounding functions have a single operand. */
|
||||||
Blockly.Arduino["math_round"] = Blockly.Arduino["math_single"];
|
Blockly.Arduino['math_round'] = Blockly.Arduino['math_single'];
|
||||||
|
|
||||||
/** Trigonometry functions have a single operand. */
|
/** Trigonometry functions have a single operand. */
|
||||||
Blockly.Arduino["math_trig"] = Blockly.Arduino["math_single"];
|
Blockly.Arduino['math_trig'] = Blockly.Arduino['math_single'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generator for the math function to a list.
|
* Generator for the math function to a list.
|
||||||
@@ -295,7 +268,7 @@ Blockly.Arduino["math_trig"] = Blockly.Arduino["math_single"];
|
|||||||
* @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["math_on_list"] = Blockly.Arduino.noGeneratorCodeInline;
|
Blockly.Arduino['math_on_list'] = Blockly.Arduino.noGeneratorCodeInline;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generator for the math modulo function (calculates remainder of X/Y).
|
* Generator for the math modulo function (calculates remainder of X/Y).
|
||||||
@@ -303,21 +276,13 @@ Blockly.Arduino["math_on_list"] = Blockly.Arduino.noGeneratorCodeInline;
|
|||||||
* @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["math_modulo"] = function (block) {
|
Blockly.Arduino['math_modulo'] = function (block) {
|
||||||
var argument0 =
|
var argument0 = Blockly.Arduino.valueToCode(block, 'DIVIDEND',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0';
|
||||||
block,
|
var argument1 = Blockly.Arduino.valueToCode(block, 'DIVISOR',
|
||||||
"DIVIDEND",
|
Blockly.Arduino.ORDER_MULTIPLICATIVE) || '0';
|
||||||
Blockly.Arduino.ORDER_MULTIPLICATIVE
|
var code = argument0 + ' % ' + argument1;
|
||||||
) || "0";
|
return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE];
|
||||||
var argument1 =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
block,
|
|
||||||
"DIVISOR",
|
|
||||||
Blockly.Arduino.ORDER_MULTIPLICATIVE
|
|
||||||
) || "0";
|
|
||||||
var code = argument0 + " % " + argument1;
|
|
||||||
return [code, Blockly.Arduino.ORDER_MULTIPLICATIVE];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -326,34 +291,18 @@ Blockly.Arduino["math_modulo"] = 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["math_constrain"] = function (block) {
|
Blockly.Arduino['math_constrain'] = function (block) {
|
||||||
// Constrain a number between two limits.
|
// Constrain a number between two limits.
|
||||||
var argument0 =
|
var argument0 = Blockly.Arduino.valueToCode(block, 'VALUE',
|
||||||
Blockly.Arduino.valueToCode(block, "VALUE", Blockly.Arduino.ORDER_NONE) ||
|
Blockly.Arduino.ORDER_NONE) || '0';
|
||||||
"0";
|
var argument1 = Blockly.Arduino.valueToCode(block, 'LOW',
|
||||||
var argument1 =
|
Blockly.Arduino.ORDER_NONE) || '0';
|
||||||
Blockly.Arduino.valueToCode(block, "LOW", Blockly.Arduino.ORDER_NONE) ||
|
var argument2 = Blockly.Arduino.valueToCode(block, 'HIGH',
|
||||||
"0";
|
Blockly.Arduino.ORDER_NONE) || '0';
|
||||||
var argument2 =
|
var code = '(' + argument0 + ' < ' + argument1 + ' ? ' + argument1 +
|
||||||
Blockly.Arduino.valueToCode(block, "HIGH", Blockly.Arduino.ORDER_NONE) ||
|
' : ( ' + argument0 + ' > ' + argument2 + ' ? ' + argument2 + ' : ' +
|
||||||
"0";
|
argument0 + '))';
|
||||||
var code =
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
"(" +
|
|
||||||
argument0 +
|
|
||||||
" < " +
|
|
||||||
argument1 +
|
|
||||||
" ? " +
|
|
||||||
argument1 +
|
|
||||||
" : ( " +
|
|
||||||
argument0 +
|
|
||||||
" > " +
|
|
||||||
argument2 +
|
|
||||||
" ? " +
|
|
||||||
argument2 +
|
|
||||||
" : " +
|
|
||||||
argument0 +
|
|
||||||
"))";
|
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -363,26 +312,28 @@ Blockly.Arduino["math_constrain"] = 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["math_random_int"] = function (block) {
|
Blockly.Arduino['math_random_int'] = function (block) {
|
||||||
var argument0 =
|
var argument0 = Blockly.Arduino.valueToCode(block, 'FROM',
|
||||||
Blockly.Arduino.valueToCode(block, "FROM", Blockly.Arduino.ORDER_NONE) ||
|
Blockly.Arduino.ORDER_NONE) || '0';
|
||||||
"0";
|
var argument1 = Blockly.Arduino.valueToCode(block, 'TO',
|
||||||
var argument1 =
|
Blockly.Arduino.ORDER_NONE) || '0';
|
||||||
Blockly.Arduino.valueToCode(block, "TO", Blockly.Arduino.ORDER_NONE) || "0";
|
var functionName = Blockly.Arduino.variableDB_.getDistinctName(
|
||||||
Blockly.Arduino.setupCode_["init_rand"] = "randomSeed(analogRead(0));";
|
'math_random_int', Blockly.Generator.NAME_TYPE);
|
||||||
Blockly.Arduino.functionNames_[
|
Blockly.Arduino.setups_['init_rand'] = 'randomSeed(analogRead(0));';
|
||||||
"math_random_int"
|
Blockly.Arduino.math_random_int.random_function = functionName;
|
||||||
] = `int mathRandomInt (int min, int max) {\n
|
var func = [
|
||||||
if (min > max) {
|
'int ' + Blockly.Arduino.DEF_FUNC_NAME + '(int min, int max) {',
|
||||||
int temp = min;
|
' if (min > max) {',
|
||||||
min = max;
|
' // Swap min and max to ensure min is smaller.',
|
||||||
max = temp;
|
' int temp = min;',
|
||||||
}
|
' min = max;',
|
||||||
return min + (rand() % (max - min + 1));
|
' max = temp;',
|
||||||
}
|
' }',
|
||||||
`;
|
' return min + (rand() % (max - min + 1));',
|
||||||
var code = `mathRandomInt(${argument0},${argument1});`;
|
'}'];
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
var funcName = Blockly.Arduino.addFunction('mathRandomInt', func.join('\n'));
|
||||||
|
var code = funcName + '(' + argument0 + ', ' + argument1 + ')';
|
||||||
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -391,6 +342,6 @@ Blockly.Arduino["math_random_int"] = 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["math_random_float"] = function (block) {
|
Blockly.Arduino['math_random_float'] = function (block) {
|
||||||
return ["(rand() / RAND_MAX)", Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
return ['(rand() / RAND_MAX)', Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,117 +0,0 @@
|
|||||||
import * as Blockly from "blockly/core";
|
|
||||||
/**
|
|
||||||
* MQTT Blocks
|
|
||||||
*/
|
|
||||||
|
|
||||||
let service;
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_mqtt_setup = function () {
|
|
||||||
var server = this.getFieldValue("server");
|
|
||||||
var port = this.getFieldValue("port");
|
|
||||||
var username = this.getFieldValue("username");
|
|
||||||
var pass = this.getFieldValue("password");
|
|
||||||
service = this.getFieldValue("service");
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.libraries_["library_adafruitmqtt"] =
|
|
||||||
'#include <Adafruit_MQTT.h> //http://librarymanager/All#Adafruit_MQTT_Library"';
|
|
||||||
Blockly.Arduino.libraries_["library_adafruitmqttclient"] =
|
|
||||||
'#include <Adafruit_MQTT_Client.h>';
|
|
||||||
Blockly.Arduino.definitions_["mqtt_server"] =
|
|
||||||
'#define SERVER "' + server + '"';
|
|
||||||
Blockly.Arduino.definitions_["mqtt_port"] =
|
|
||||||
"#define SERVERPORT " + port + "";
|
|
||||||
Blockly.Arduino.definitions_["mqtt_username"] =
|
|
||||||
'#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) {
|
|
||||||
var feedname = this.getFieldValue("publishfeed");
|
|
||||||
var res = feedname.split("/");
|
|
||||||
var feed_client = res[res.length - 1];
|
|
||||||
var value =
|
|
||||||
Blockly.Arduino.valueToCode(this, "value", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
'"No Block connected"';
|
|
||||||
|
|
||||||
switch (service) {
|
|
||||||
case "adafruitio":
|
|
||||||
Blockly.Arduino.definitions_["mqtt_" + feed_client + ""] =
|
|
||||||
"Adafruit_MQTT_Publish " +
|
|
||||||
feed_client +
|
|
||||||
' = Adafruit_MQTT_Publish(&mqtt, USERNAME "/feeds/' +
|
|
||||||
feedname +
|
|
||||||
'");';
|
|
||||||
break;
|
|
||||||
case "dioty":
|
|
||||||
Blockly.Arduino.definitions_["mqtt_" + feed_client + ""] =
|
|
||||||
"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_[
|
|
||||||
"mqtt_connect_function"
|
|
||||||
] = `// 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.
|
|
||||||
void MQTT_connect() {
|
|
||||||
int8_t ret;
|
|
||||||
// Stop if already connected.
|
|
||||||
if (mqtt.connected()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
|
|
||||||
mqtt.disconnect();
|
|
||||||
delay(5000); // wait 5 seconds
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
Blockly.Arduino.loopCodeOnce_["mqtt_connect"] = "MQTT_connect();";
|
|
||||||
var code = "" + feed_client + ".publish(" + value + ");";
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_mqtt_subscribe = function (block) {
|
|
||||||
var feedname = this.getFieldValue("subscribefeed");
|
|
||||||
var x = 5,
|
|
||||||
feed_client;
|
|
||||||
feed_client = feedname.substr(feedname.length - x, 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);
|
|
||||||
}`;
|
|
||||||
Blockly.Arduino.setupCode_["mqtt_" + feed_client + "_callback"] =
|
|
||||||
"" + feed_client + ".setCallback(" + feed_client + "Callback);";
|
|
||||||
Blockly.Arduino.setupCode_["mqtt_" + feed_client + "_subscribe"] =
|
|
||||||
"mqtt.subscribe(&" + feed_client + ");";
|
|
||||||
Blockly.Arduino.loopCodeOnce_["mqtt_processPackages"] =
|
|
||||||
"mqtt.processPackets(10);";
|
|
||||||
var code = "";
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
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.
|
||||||
@@ -6,122 +7,24 @@ 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(
|
throw new Error('Expecting code from statement block "' + targetBlock.type + '".');
|
||||||
'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) {
|
|
||||||
// Define a procedure with a return value.
|
|
||||||
const funcName = Blockly.Arduino.nameDB_.getName(
|
|
||||||
block.getFieldValue("NAME"),
|
|
||||||
Blockly.Procedures.NAME_TYPE
|
|
||||||
);
|
|
||||||
const branch = Blockly.Arduino.statementToCode(block, "STACK");
|
|
||||||
const returnType = block.getFieldValue("RETURN TYPE") || "void";
|
|
||||||
|
|
||||||
let returnValue =
|
|
||||||
Blockly.Arduino.valueToCode(block, "RETURN", Blockly.Arduino.ORDER_NONE) ||
|
|
||||||
"";
|
|
||||||
if (returnValue) {
|
|
||||||
returnValue = Blockly.Arduino.INDENT + "return " + returnValue + ";\n";
|
|
||||||
}
|
|
||||||
const args = [];
|
|
||||||
for (let i = 0; i < block.argumentVarModels_.length; i++) {
|
|
||||||
args[i] =
|
|
||||||
translateType(block.argumentVarModels_[i].type) +
|
|
||||||
" " +
|
|
||||||
block.argumentVarModels_[i].name;
|
|
||||||
}
|
|
||||||
let code =
|
|
||||||
translateType(returnType) +
|
|
||||||
" " +
|
|
||||||
funcName +
|
|
||||||
"(" +
|
|
||||||
args.join(", ") +
|
|
||||||
") {\n" +
|
|
||||||
branch +
|
|
||||||
returnValue +
|
|
||||||
"}";
|
|
||||||
code = Blockly.Arduino.scrub_(block, code);
|
|
||||||
// Add % so as not to collide with helper functions in definitions list.
|
|
||||||
Blockly.Arduino.functionNames_["%" + funcName] = code;
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
function translateType(type) {
|
|
||||||
switch (type) {
|
|
||||||
case "int":
|
|
||||||
return "int";
|
|
||||||
case "String":
|
|
||||||
return "String";
|
|
||||||
case "void":
|
|
||||||
return "void";
|
|
||||||
case "boolean":
|
|
||||||
return "boolean";
|
|
||||||
case "float":
|
|
||||||
return "float";
|
|
||||||
default:
|
|
||||||
throw new Error("Invalid Parameter Type");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Blockly.Arduino["procedures_defnoreturn"] =
|
|
||||||
Blockly.Arduino["procedures_defreturn"];
|
|
||||||
|
|
||||||
Blockly.Arduino["procedures_callreturn"] = function (block) {
|
|
||||||
// Call a procedure with a return value.
|
|
||||||
const funcName = Blockly.Arduino.nameDB_.getName(
|
|
||||||
block.getFieldValue("NAME"),
|
|
||||||
Blockly.Procedures.NAME_TYPE
|
|
||||||
);
|
|
||||||
const args = [];
|
|
||||||
for (let i = 0; i < block.arguments_.length; i++) {
|
|
||||||
args[i] =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
block,
|
|
||||||
"ARG" + i,
|
|
||||||
Blockly.Arduino.ORDER_COMMA
|
|
||||||
) || "null";
|
|
||||||
}
|
|
||||||
const code = funcName + "(" + args.join(", ") + ")";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino["procedures_callnoreturn"] = function (block) {
|
|
||||||
// Call a procedure with no return value.
|
|
||||||
const funcName = Blockly.Arduino.nameDB_.getName(
|
|
||||||
block.getFieldValue("NAME"),
|
|
||||||
Blockly.Procedures.NAME_TYPE
|
|
||||||
);
|
|
||||||
const args = [];
|
|
||||||
for (let i = 0; i < block.arguments_.length; i++) {
|
|
||||||
args[i] =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
block,
|
|
||||||
"ARG" + i,
|
|
||||||
Blockly.Arduino.ORDER_COMMA
|
|
||||||
) || "null";
|
|
||||||
}
|
|
||||||
|
|
||||||
return funcName + "(" + args.join(", ") + ");\n";
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,128 +0,0 @@
|
|||||||
import * as Blockly from "blockly/core";
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_phyphox_init = function () {
|
|
||||||
var name = this.getFieldValue("devicename");
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.libraries_["phyphox_library"] = `#include <phyphoxBle.h>`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
"phyphox_start"
|
|
||||||
] = `PhyphoxBLE::start("${name}");`;
|
|
||||||
var code = ``;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_phyphox_experiment = function () {
|
|
||||||
var experimentname = "experiment";
|
|
||||||
var title = this.getFieldValue("title").replace(/[^a-zA-Z0-9]/g, "");
|
|
||||||
var description = this.getFieldValue("description");
|
|
||||||
var branch = Blockly.Arduino.statementToCode(this, "view");
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`PhyphoxBleExperiment_${experimentname}`
|
|
||||||
] = `PhyphoxBleExperiment ${experimentname};`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`setTitle_${title}`
|
|
||||||
] = `${experimentname}.setTitle("${title}");`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`setCategory_senseBoxExperiments}`
|
|
||||||
] = `${experimentname}.setCategory("senseBox Experimente");`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`setDescription_${description}`
|
|
||||||
] = `${experimentname}.setDescription("${description}");`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`addView_${experimentname}`
|
|
||||||
] = `PhyphoxBleExperiment::View firstView;\nfirstView.setLabel("Messwerte"); //Create a "view"`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[`addGraph`] = `${branch}`;
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`addView_firstview`
|
|
||||||
] = `${experimentname}.addView(firstView);`; //Attach view to experiment
|
|
||||||
Blockly.Arduino.phyphoxSetupCode_[
|
|
||||||
`addExperiment_${experimentname}`
|
|
||||||
] = `PhyphoxBLE::addExperiment(${experimentname});`; //Attach experiment to server
|
|
||||||
|
|
||||||
var code = ``;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino["sensebox_phyphox_timestamp"] = function () {
|
|
||||||
var code = 0;
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino["sensebox_phyphox_channel"] = function () {
|
|
||||||
var channel = parseFloat(this.getFieldValue("channel"));
|
|
||||||
var code = channel;
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_phyphox_sendchannel = function (block) {
|
|
||||||
var channel = this.getFieldValue("channel");
|
|
||||||
var value =
|
|
||||||
Blockly.Arduino.valueToCode(this, "value", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"1";
|
|
||||||
|
|
||||||
var code = `float channel${channel} = ${value};\n`;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_phyphox_graph = function () {
|
|
||||||
var label = this.getFieldValue("label").replace(/[^a-zA-Z0-9]/g, "");
|
|
||||||
var unitx = this.getFieldValue("unitx");
|
|
||||||
var unity = this.getFieldValue("unity");
|
|
||||||
var labelx = this.getFieldValue("labelx");
|
|
||||||
var labely = this.getFieldValue("labely");
|
|
||||||
var style = this.getFieldValue("style");
|
|
||||||
var channelX =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"channel0",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
) || 0;
|
|
||||||
var channelY =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"channel1",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
) || 1;
|
|
||||||
|
|
||||||
var code = `PhyphoxBleExperiment::Graph ${label};\n`; //Create graph which will plot random numbers over time
|
|
||||||
code += `${label}.setLabel("${label}");\n`;
|
|
||||||
code += `${label}.setUnitX("${unitx}");\n`;
|
|
||||||
code += `${label}.setUnitY("${unity}");\n`;
|
|
||||||
code += `${label}.setLabelX("${labelx}");\n`;
|
|
||||||
code += `${label}.setLabelY("${labely}");\n`;
|
|
||||||
if (style === "dots"){
|
|
||||||
code += `${label}.setStyle("${style}");\n`;
|
|
||||||
}
|
|
||||||
code += `${label}.setChannel(${channelX}, ${channelY});\n`;
|
|
||||||
code += `firstView.addElement(${label});\n`;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_phyphox_experiment_send = function () {
|
|
||||||
var branch = Blockly.Arduino.statementToCode(this, "sendValues");
|
|
||||||
var blocks = this.getDescendants();
|
|
||||||
console.log(blocks);
|
|
||||||
var count = 0;
|
|
||||||
if (blocks !== undefined) {
|
|
||||||
for (var i = 0; i < blocks.length; i++) {
|
|
||||||
if (blocks[i].type === "sensebox_phyphox_sendchannel") {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count === 5) {
|
|
||||||
}
|
|
||||||
var string = "";
|
|
||||||
|
|
||||||
for (var j = 1; j <= count; j++) {
|
|
||||||
console.log("append");
|
|
||||||
if (string === "") {
|
|
||||||
string += `channel${j}`;
|
|
||||||
} else if (string !== "") {
|
|
||||||
string += `, channel${j}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Blockly.Arduino.loopCodeOnce_["phyphox_poll"] = `PhyphoxBLE::poll();`;
|
|
||||||
var code = `${branch}\nPhyphoxBLE::write(${string});`;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
@@ -1,236 +1,92 @@
|
|||||||
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"] =
|
Blockly.Arduino.libraries_['library_AdafruitGFX'] = '#include <Adafruit_GFX.h>';
|
||||||
"#include <Adafruit_GFX.h> // http://librarymanager/All#Adafruit_GFX_Library";
|
Blockly.Arduino.libraries_['library_AdafruitSSD1306'] = '#include <Adafruit_SSD1306.h>';
|
||||||
Blockly.Arduino.libraries_["library_AdafruitSSD1306"] =
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
"#include <Adafruit_SSD1306.h> // http://librarymanager/All#Adafruit_SSD1306";
|
Blockly.Arduino.definitions_['define_display'] = '#define OLED_RESET 4\nAdafruit_SSD1306 display(OLED_RESET);';
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.setupCode_['sensebox_display_begin'] = 'senseBoxIO.powerI2C(true);\ndelay(2000);\ndisplay.begin(SSD1306_SWITCHCAPVCC, 0x3D);\ndisplay.display();\ndelay(100);\ndisplay.clearDisplay();';
|
||||||
Blockly.Arduino.definitions_[
|
var code = '';
|
||||||
"define_display_size"
|
return code;
|
||||||
] = `#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 = Blockly.Arduino.valueToCode(this, 'X', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var y = this.getFieldValue("Y");
|
var y = Blockly.Arduino.valueToCode(this, 'Y', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var printDisplay =
|
var printDisplay = Blockly.Arduino.valueToCode(this, 'printDisplay', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"';
|
||||||
Blockly.Arduino.valueToCode(
|
var size = Blockly.Arduino.valueToCode(this, 'SIZE', Blockly.Arduino.ORDER_ATOMIC) || '1'
|
||||||
this,
|
var color = this.getFieldValue('COLOR');
|
||||||
"printDisplay",
|
var code = 'display.setCursor(' + x + ',' + y + ');\n';
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
code += 'display.setTextSize(' + size + ');\n';
|
||||||
) || '"Keine Eingabe"';
|
code += 'display.setTextColor(' + color + ');\n';
|
||||||
var size = this.getFieldValue("SIZE");
|
code += 'display.println(' + printDisplay + ');\n';
|
||||||
var color = this.getFieldValue("COLOR");
|
return code;
|
||||||
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 () {
|
|
||||||
var title1 =
|
|
||||||
Blockly.Arduino.valueToCode(this, "Title1", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"0";
|
|
||||||
var value1 = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"Value1",
|
|
||||||
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) {
|
|
||||||
|
|
||||||
display.setCursor(0, 0);
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.setTextColor(WHITE, BLACK);
|
|
||||||
display.println(title1);
|
|
||||||
display.setCursor(0, 10);
|
|
||||||
display.setTextSize(2);
|
|
||||||
display.print(measurement1);
|
|
||||||
display.print(" ");
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.println(unit1);
|
|
||||||
display.setCursor(0, 30);
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.println(title2);
|
|
||||||
display.setCursor(0, 40);
|
|
||||||
display.setTextSize(2);
|
|
||||||
display.print(measurement2);
|
|
||||||
display.print(" ");
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.println(unit2);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
var code = ` printOnDisplay(${title1}, String(${value1}), ${dimension1}, ${title2}, String(${value2}), ${dimension2});\n`;
|
|
||||||
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 =
|
var YLabel = Blockly.Arduino.valueToCode(this, 'YLabel', Blockly.Arduino.ORDER_ATOMIC) || 'Y'
|
||||||
Blockly.Arduino.valueToCode(this, "YLabel", Blockly.Arduino.ORDER_ATOMIC) ||
|
var XLabel = Blockly.Arduino.valueToCode(this, 'XLabel', Blockly.Arduino.ORDER_ATOMIC) || 'X'
|
||||||
"Y";
|
var Title = Blockly.Arduino.valueToCode(this, 'Title', Blockly.Arduino.ORDER_ATOMIC) || 'Title'
|
||||||
var XLabel =
|
var XRange1 = Blockly.Arduino.valueToCode(this, 'XRange1', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(this, "XLabel", Blockly.Arduino.ORDER_ATOMIC) ||
|
var XRange2 = Blockly.Arduino.valueToCode(this, 'XRange2', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
"X";
|
var YRange1 = Blockly.Arduino.valueToCode(this, 'YRange1', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var Title =
|
var YRange2 = Blockly.Arduino.valueToCode(this, 'YRange2', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(this, "Title", Blockly.Arduino.ORDER_ATOMIC) ||
|
var XTick = Blockly.Arduino.valueToCode(this, 'XTick', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
"Title";
|
var YTick = Blockly.Arduino.valueToCode(this, 'YTick', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var XRange1 =
|
var TimeFrame = Blockly.Arduino.valueToCode(this, 'TimeFrame', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(
|
var plotDisplay = Blockly.Arduino.valueToCode(this, 'plotDisplay', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"';
|
||||||
this,
|
Blockly.Arduino.libraries_['library_plot'] = '#include <Plot.h>';
|
||||||
"XRange1",
|
Blockly.Arduino.definitions_['define_plot_class'] = 'Plot DataPlot(&display);\n';
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
Blockly.Arduino.variables_['define_plot_class'] = 'const double TIMEFRAME = ' + TimeFrame + ';\n';
|
||||||
) || "0";
|
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 XRange2 =
|
var code = 'DataPlot.clear();'
|
||||||
Blockly.Arduino.valueToCode(
|
code += 'double starttime = millis();\ndouble t = 0;\nwhile (t <= TIMEFRAME) {\nt = (millis() - starttime) / 1000.0;\nfloat value = ' + plotDisplay + ';\n';
|
||||||
this,
|
code += 'DataPlot.addDataPoint(t,value);\n}\n';
|
||||||
"XRange2",
|
return code;
|
||||||
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 =
|
var x = Blockly.Arduino.valueToCode(this, 'X', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(this, "X", Blockly.Arduino.ORDER_ATOMIC) || "0";
|
var y = Blockly.Arduino.valueToCode(this, 'Y', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var y =
|
var radius = Blockly.Arduino.valueToCode(this, 'Radius', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(this, "Y", Blockly.Arduino.ORDER_ATOMIC) || "0";
|
var fill = this.getFieldValue('FILL');
|
||||||
var radius =
|
if (fill === 'TRUE') {
|
||||||
Blockly.Arduino.valueToCode(this, "Radius", Blockly.Arduino.ORDER_ATOMIC) ||
|
code = 'display.fillCircle(' + x + ',' + y + ',' + radius + ',1);\n';
|
||||||
"0";
|
}
|
||||||
var fill = this.getFieldValue("FILL");
|
else {
|
||||||
if (fill === "TRUE") {
|
code = 'display.drawCircle(' + x + ',' + y + ',' + radius + ',1);\n';
|
||||||
code = "display.fillCircle(" + x + "," + y + "," + radius + ",1);\n";
|
}
|
||||||
} else {
|
return code;
|
||||||
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 =
|
var x = Blockly.Arduino.valueToCode(this, 'X', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(this, "X", Blockly.Arduino.ORDER_ATOMIC) || "0";
|
var y = Blockly.Arduino.valueToCode(this, 'Y', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var y =
|
var width = Blockly.Arduino.valueToCode(this, 'width', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
Blockly.Arduino.valueToCode(this, "Y", Blockly.Arduino.ORDER_ATOMIC) || "0";
|
var height = Blockly.Arduino.valueToCode(this, 'height', Blockly.Arduino.ORDER_ATOMIC) || '0'
|
||||||
var width =
|
var fill = this.getFieldValue('FILL');
|
||||||
Blockly.Arduino.valueToCode(this, "width", Blockly.Arduino.ORDER_ATOMIC) ||
|
if (fill === 'TRUE') {
|
||||||
"0";
|
code = 'display.fillRect(' + x + ',' + y + ',' + width + ',' + height + ',1);\n';
|
||||||
var height =
|
}
|
||||||
Blockly.Arduino.valueToCode(this, "height", Blockly.Arduino.ORDER_ATOMIC) ||
|
else {
|
||||||
"0";
|
code = 'display.drawRect(' + x + ',' + y + ',' + width + ',' + height + ',1);\n';
|
||||||
var fill = this.getFieldValue("FILL");
|
}
|
||||||
if (fill === "TRUE") {
|
return code;
|
||||||
code =
|
}
|
||||||
"display.fillRect(" + x + "," + y + "," + width + "," + height + ",1);\n";
|
|
||||||
} else {
|
|
||||||
code =
|
|
||||||
"display.drawRect(" + x + "," + y + "," + width + "," + height + ",1);\n";
|
|
||||||
}
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
@@ -3,7 +3,6 @@ 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,62 +10,13 @@ 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 red = this.getFieldValue('RED') || '0'
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
var green = this.getFieldValue('GREEN') || '0'
|
||||||
|
var blue = this.getFieldValue('BLUE') || '0'
|
||||||
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(' + red + ',' + green + ',' + blue + '));\n';
|
||||||
code += 'rgb_led_' + dropdown_pin + '.show();';
|
code += 'rgb_led_' + dropdown_pin + '.show();';
|
||||||
return code;
|
return code;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_ws2818_led_init = function () {
|
|
||||||
var dropdown_pin = this.getFieldValue('Port');
|
|
||||||
var numPixel = Blockly.Arduino.valueToCode(this, 'NUMBER', Blockly.Arduino.ORDER_ATOMIC) || '1';
|
|
||||||
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.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`;
|
|
||||||
return '';
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_ws2818_led = function () {
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
var dropdown_pin = this.getFieldValue('Port');
|
|
||||||
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 code = `rgb_led_${dropdown_pin}.setPixelColor(${position},rgb_led_${dropdown_pin}.Color(${color}));\nrgb_led_${dropdown_pin}.show();\n`;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function hexToRgb(hex) {
|
|
||||||
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
||||||
return result ? {
|
|
||||||
r: parseInt(result[1], 16),
|
|
||||||
g: parseInt(result[2], 16),
|
|
||||||
b: parseInt(result[3], 16)
|
|
||||||
} : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Blockly.Arduino['colour_picker'] = function (block) {
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
const rgb = hexToRgb(block.getFieldValue('COLOUR'));
|
|
||||||
|
|
||||||
return [rgb.r + ', ' + rgb.g + ', ' + rgb.b, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino['colour_random'] = function (block) {
|
|
||||||
return ['random(0, 255), random(0, 255), random(0, 255)', Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
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 green = Blockly.Arduino.valueToCode(block, 'GREEN', Blockly.Arduino.ORDER_ATOMIC);
|
|
||||||
const blue = Blockly.Arduino.valueToCode(block, 'BLUE', Blockly.Arduino.ORDER_ATOMIC);
|
|
||||||
|
|
||||||
return [red + ', ' + green + ', ' + blue, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
@@ -1,27 +1,27 @@
|
|||||||
import * as Blockly from "blockly/core";
|
import * as Blockly from 'blockly/core';
|
||||||
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_initialize_otaa = function (block) {
|
Blockly.Arduino.sensebox_lora_initialize_otaa = function (block) {
|
||||||
var deivceID = this.getFieldValue("DEVICEID");
|
var deivceID = this.getFieldValue('DEVICEID');
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
|
Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>';
|
||||||
Blockly.Arduino.libraries_["library_lmic"] =
|
Blockly.Arduino.libraries_['library_lmic'] = '#include <lmic.h>';
|
||||||
"#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}};
|
|
||||||
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI , 8);}
|
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI , 8);}
|
||||||
|
|
||||||
static const u1_t PROGMEM DEVEUI[8]= {${deivceID}};
|
static const u1_t PROGMEM DEVEUI[8]= `+ deivceID + `;
|
||||||
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI , 8);}
|
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI , 8);}
|
||||||
|
|
||||||
// This key should be in big endian format (or, since it is not really a
|
// This key should be in big endian format (or, since it is not really a
|
||||||
// number but a block of memory, endianness does not really apply). In
|
// number but a block of memory, endianness does not really apply). In
|
||||||
// practice, a key taken from ttnctl can be copied as-is.
|
// practice, a key taken from ttnctl can be copied as-is.
|
||||||
// The key shown here is the semtech default key.
|
// The key shown here is the semtech default key.
|
||||||
static const u1_t PROGMEM APPKEY[16] = {${appKey}};
|
static const u1_t PROGMEM APPKEY[16] = `+ appKey + `;
|
||||||
void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY , 16);}
|
void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY , 16);}
|
||||||
|
|
||||||
static osjob_t sendjob;
|
static osjob_t sendjob;
|
||||||
@@ -38,7 +38,7 @@ Blockly.Arduino.sensebox_lora_initialize_otaa = function (block) {
|
|||||||
.dio = {PIN_XB1_INT, PIN_XB1_INT, LMIC_UNUSED_PIN},
|
.dio = {PIN_XB1_INT, PIN_XB1_INT, LMIC_UNUSED_PIN},
|
||||||
};`;
|
};`;
|
||||||
|
|
||||||
Blockly.Arduino.codeFunctions_["functions_initLora"] = `
|
Blockly.Arduino.codeFunctions_['functions_initLora'] = `
|
||||||
void initLora() {
|
void initLora() {
|
||||||
delay(2000);
|
delay(2000);
|
||||||
// LMIC init
|
// LMIC init
|
||||||
@@ -48,9 +48,9 @@ Blockly.Arduino.sensebox_lora_initialize_otaa = function (block) {
|
|||||||
|
|
||||||
// Start job (sending automatically starts OTAA too)
|
// Start job (sending automatically starts OTAA too)
|
||||||
do_send(&sendjob);
|
do_send(&sendjob);
|
||||||
}`;
|
}`
|
||||||
|
|
||||||
Blockly.Arduino.codeFunctions_["functions_onEvent"] = `
|
Blockly.Arduino.codeFunctions_['functions_onEvent'] = `
|
||||||
void onEvent (ev_t ev) {
|
void onEvent (ev_t ev) {
|
||||||
Serial.print(os_getTime());
|
Serial.print(os_getTime());
|
||||||
Serial.print(": ");
|
Serial.print(": ");
|
||||||
@@ -120,18 +120,16 @@ Blockly.Arduino.sensebox_lora_initialize_otaa = function (block) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}`;
|
}`;
|
||||||
Blockly.Arduino.loraSetupCode_["initLora"] = "initLora();\n";
|
Blockly.Arduino.setupCode_['initLora'] = 'initLora();';
|
||||||
Blockly.Arduino.setupCode_["serial.begin"] =
|
Blockly.Arduino.setupCode_['serial.begin'] = 'Serial.begin(9600);';
|
||||||
"Serial.begin(9600);\ndelay(1000);\n";
|
var code = ''
|
||||||
var code = "";
|
return code;
|
||||||
return code;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_message_send = function (block) {
|
Blockly.Arduino.sensebox_lora_message_send = function (block) {
|
||||||
Blockly.Arduino.libraries_["library_lora_message"] =
|
Blockly.Arduino.libraries_['library_lora_message'] = '#include <LoraMessage.h>';
|
||||||
"#include <LoraMessage.h>";
|
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"] = `
|
|
||||||
void do_send(osjob_t* j){
|
void do_send(osjob_t* j){
|
||||||
// Check if there is not a current TX/RX job running
|
// Check if there is not a current TX/RX job running
|
||||||
if (LMIC.opmode & OP_TXRXPEND) {
|
if (LMIC.opmode & OP_TXRXPEND) {
|
||||||
@@ -146,42 +144,39 @@ Blockly.Arduino.sensebox_lora_message_send = function (block) {
|
|||||||
}
|
}
|
||||||
// Next TX is scheduled after TX_COMPLETE event.
|
// Next TX is scheduled after TX_COMPLETE event.
|
||||||
}`;
|
}`;
|
||||||
Blockly.Arduino.loopCodeOnce_["os_runloop"] = "os_runloop_once();";
|
Blockly.Arduino.loopCodeOnce_['os_runloop'] = 'os_runloop_once();'
|
||||||
return "";
|
return ''
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Block send Data to TTN
|
* Block send Data to TTN
|
||||||
*/
|
*/
|
||||||
Blockly.Arduino.sensebox_send_lora_sensor_value = function (block) {
|
Blockly.Arduino.sensebox_send_lora_sensor_value = function (block) {
|
||||||
const reading =
|
const reading = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"';
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
var messageBytes = this.getFieldValue('MESSAGE_BYTES');
|
||||||
'"Keine Eingabe"';
|
var code = ''
|
||||||
var messageBytes = this.getFieldValue("MESSAGE_BYTES");
|
switch (Number(messageBytes)) {
|
||||||
var code = "";
|
case 1:
|
||||||
switch (Number(messageBytes)) {
|
code = `message.addUint8(${reading});\n`
|
||||||
case 1:
|
break;
|
||||||
code = `message.addUint8(${reading});\n`;
|
case 2:
|
||||||
break;
|
code = `message.addUint16(${reading});\n`
|
||||||
case 2:
|
break;
|
||||||
code = `message.addUint16(${reading});\n`;
|
case 3:
|
||||||
break;
|
code = `message.addUint8(${reading});
|
||||||
case 3:
|
message.addUint16(${reading} >> 8);\n`
|
||||||
code = `message.addUint8(${reading});
|
break;
|
||||||
message.addUint16(${reading} >> 8);\n`;
|
default:
|
||||||
break;
|
code = `message.addUint16(${reading});\n`
|
||||||
default:
|
}
|
||||||
code = `message.addUint16(${reading});\n`;
|
return code;
|
||||||
}
|
|
||||||
return code;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_send = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_send = function (block) {
|
||||||
Blockly.Arduino.libraries_["library_cayene"] =
|
Blockly.Arduino.libraries_['library_cayene'] = '#include <CayenneLPP.h>';
|
||||||
"#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"] = `
|
|
||||||
void do_send(osjob_t* j){
|
void do_send(osjob_t* j){
|
||||||
// Check if there is not a current TX/RX job running
|
// Check if there is not a current TX/RX job running
|
||||||
if (LMIC.opmode & OP_TXRXPEND) {
|
if (LMIC.opmode & OP_TXRXPEND) {
|
||||||
@@ -196,103 +191,29 @@ Blockly.Arduino.sensebox_lora_cayenne_send = function (block) {
|
|||||||
}
|
}
|
||||||
// Next TX is scheduled after TX_COMPLETE event.
|
// Next TX is scheduled after TX_COMPLETE event.
|
||||||
}`;
|
}`;
|
||||||
Blockly.Arduino.loopCodeOnce_["os_runloop"] = "os_runloop_once();";
|
Blockly.Arduino.loopCodeOnce_['os_runloop'] = 'os_runloop_once();'
|
||||||
return "";
|
return '';
|
||||||
};
|
}
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_ttn_mapper = function (block) {
|
|
||||||
var latitude = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"Latitude",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var longitude = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"Longitude",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var altitude = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"Altitude",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var pDOP = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"pDOP",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var fixType = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"Fix Type",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var fixTypeLimit = this.getFieldValue("dropdown");
|
|
||||||
Blockly.Arduino.functionNames_["functions_do_send"] = `
|
|
||||||
void do_send(osjob_t* j){
|
|
||||||
// Check if there is not a current TX/RX job running
|
|
||||||
if (LMIC.opmode & OP_TXRXPEND) {
|
|
||||||
Serial.println(F("OP_TXRXPEND, not sending"));
|
|
||||||
} else {
|
|
||||||
|
|
||||||
int fixType = ${fixType};
|
|
||||||
if (fixType >= ${fixTypeLimit}) { // we have a 3D fix
|
|
||||||
int32_t latitude = ${latitude}; // in degrees * 10^-7
|
|
||||||
int32_t longitude = ${longitude}; // in degrees * 10^-7
|
|
||||||
int32_t altitude = ${altitude} / 100; // in dm above mean sea level
|
|
||||||
uint16_t pDOP = ${pDOP}; // positional dillution of precision
|
|
||||||
|
|
||||||
uint8_t data[12];
|
|
||||||
|
|
||||||
data[0] = latitude;
|
|
||||||
data[1] = latitude >> 8;
|
|
||||||
data[2] = latitude >> 16;
|
|
||||||
data[3] = latitude >> 24;
|
|
||||||
|
|
||||||
data[4] = longitude;
|
|
||||||
data[5] = longitude >> 8;
|
|
||||||
data[6] = longitude >> 16;
|
|
||||||
data[7] = longitude >> 24;
|
|
||||||
|
|
||||||
data[8] = altitude;
|
|
||||||
data[9] = altitude >> 8;
|
|
||||||
|
|
||||||
data[10] = pDOP;
|
|
||||||
data[11] = pDOP >> 8;
|
|
||||||
|
|
||||||
|
|
||||||
// Prepare upstream data transmission at the next possible time.
|
|
||||||
LMIC_setTxData2(1, data, sizeof(data), 0);
|
|
||||||
Serial.println(F("Packet queued"));
|
|
||||||
} else {
|
|
||||||
// wait for better fix type
|
|
||||||
os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL), do_send);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Next TX is scheduled after TX_COMPLETE event.
|
|
||||||
}`;
|
|
||||||
Blockly.Arduino.loopCodeOnce_["os_runloop"] = "os_runloop_once();";
|
|
||||||
return "";
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_initialize_abp = function (block) {
|
Blockly.Arduino.sensebox_lora_initialize_abp = function (block) {
|
||||||
var nwskey = this.getFieldValue("NWSKEY");
|
var nwskey = this.getFieldValue('NWSKEY');
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#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>';
|
||||||
Blockly.Arduino.definitions_["define_LoRaVariablesABP"] = `
|
Blockly.Arduino.definitions_['define_LoRaVariablesABP'] = `
|
||||||
// LoRaWAN NwkSKey, network session key
|
// LoRaWAN NwkSKey, network session key
|
||||||
// This is the default Semtech key, which is used by the early prototype TTN
|
// This is the default Semtech key, which is used by the early prototype TTN
|
||||||
// network.
|
// network.
|
||||||
static const PROGMEM u1_t NWKSKEY[16] = { ${nwskey} };
|
static const PROGMEM u1_t NWKSKEY[16] = ${nwskey};
|
||||||
|
|
||||||
// LoRaWAN AppSKey, application session key
|
// LoRaWAN AppSKey, application session key
|
||||||
// This is the default Semtech key, which is used by the early prototype TTN
|
// This is the default Semtech key, which is used by the early prototype TTN
|
||||||
// network.
|
// network.
|
||||||
static const u1_t PROGMEM APPSKEY[16] = { ${appskey} };
|
static const u1_t PROGMEM APPSKEY[16] = ${appskey};
|
||||||
|
|
||||||
// LoRaWAN end-device address (DevAddr)
|
// LoRaWAN end-device address (DevAddr)
|
||||||
static const u4_t DEVADDR = 0x${devaddr};
|
static const u4_t DEVADDR = 0x${devaddr};
|
||||||
@@ -318,7 +239,7 @@ Blockly.Arduino.sensebox_lora_initialize_abp = function (block) {
|
|||||||
.dio = {PIN_XB1_INT, PIN_XB1_INT, LMIC_UNUSED_PIN},
|
.dio = {PIN_XB1_INT, PIN_XB1_INT, LMIC_UNUSED_PIN},
|
||||||
};`;
|
};`;
|
||||||
|
|
||||||
Blockly.Arduino.codeFunctions_["functions_initLora"] = `
|
Blockly.Arduino.codeFunctions_['functions_initLora'] = `
|
||||||
void initLora() {
|
void initLora() {
|
||||||
delay(2000);
|
delay(2000);
|
||||||
// LMIC init
|
// LMIC init
|
||||||
@@ -384,9 +305,9 @@ Blockly.Arduino.sensebox_lora_initialize_abp = function (block) {
|
|||||||
|
|
||||||
// Start job
|
// Start job
|
||||||
do_send(&sendjob);
|
do_send(&sendjob);
|
||||||
}`;
|
}`
|
||||||
|
|
||||||
Blockly.Arduino.codeFunctions_["functions_onEvent"] = `
|
Blockly.Arduino.codeFunctions_['functions_onEvent'] = `
|
||||||
void onEvent (ev_t ev) {
|
void onEvent (ev_t ev) {
|
||||||
Serial.print(os_getTime());
|
Serial.print(os_getTime());
|
||||||
Serial.print(": ");
|
Serial.print(": ");
|
||||||
@@ -451,86 +372,60 @@ Blockly.Arduino.sensebox_lora_initialize_abp = function (block) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}`;
|
}`;
|
||||||
Blockly.Arduino.loraSetupCode_["initLora"] = "initLora();\n";
|
Blockly.Arduino.setupCode_['initLora'] = 'initLora();';
|
||||||
Blockly.Arduino.setupCode_["serial.begin"] =
|
Blockly.Arduino.setupCode_['serial.begin'] = 'Serial.begin(9600);';
|
||||||
"Serial.begin(9600);\ndelay(1000);\n";
|
return '';
|
||||||
return "";
|
}
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_temperature = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_temperature = function (block) {
|
||||||
var temperature =
|
var temperature = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
0;
|
var code = `lpp.addTemperature(${channel}, ${temperature});\n`;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
return code;
|
||||||
var code = `lpp.addTemperature(${channel}, ${temperature});\n`;
|
}
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_humidity = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_humidity = function (block) {
|
||||||
var humidity =
|
var humidity = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
0;
|
var code = `lpp.addRelativeHumidity(${channel}, ${humidity});\n`;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
return code;
|
||||||
var code = `lpp.addRelativeHumidity(${channel}, ${humidity});\n`;
|
}
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_pressure = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_pressure = function (block) {
|
||||||
var pressure =
|
var pressure = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
0;
|
var code = `lpp.addBarometricPressure(${channel}, ${pressure});\n`;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
return code;
|
||||||
var code = `lpp.addBarometricPressure(${channel}, ${pressure});\n`;
|
}
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_luminosity = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_luminosity = function (block) {
|
||||||
var luminosity =
|
var luminosity = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
0;
|
var code = `lpp.addLuminosity(${channel}, ${luminosity});\n`;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
return code;
|
||||||
var code = `lpp.addLuminosity(${channel}, ${luminosity});\n`;
|
}
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_sensor = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_sensor = function (block) {
|
||||||
var sensorValue =
|
var sensorValue = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
0;
|
var code = `lpp.addAnalogInput(${channel}, ${sensorValue});\n`;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
return code;
|
||||||
var code = `lpp.addAnalogInput(${channel}, ${sensorValue});\n`;
|
}
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_accelerometer = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_accelerometer = function (block) {
|
||||||
var x =
|
var x = Blockly.Arduino.valueToCode(this, 'X', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "X", Blockly.Arduino.ORDER_ATOMIC) || 0;
|
var y = Blockly.Arduino.valueToCode(this, 'Y', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
var y =
|
var z = Blockly.Arduino.valueToCode(this, 'Z', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "Y", Blockly.Arduino.ORDER_ATOMIC) || 0;
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
var z =
|
var code = `lpp.addAccelerometer(${channel}, ${x}, ${y}, ${z});\n`;
|
||||||
Blockly.Arduino.valueToCode(this, "Z", Blockly.Arduino.ORDER_ATOMIC) || 0;
|
return code;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
}
|
||||||
var code = `lpp.addAccelerometer(${channel}, ${x}, ${y}, ${z});\n`;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_lora_cayenne_gps = function (block) {
|
Blockly.Arduino.sensebox_lora_cayenne_gps = function (block) {
|
||||||
var lat =
|
var lat = Blockly.Arduino.valueToCode(this, 'LAT', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "LAT", Blockly.Arduino.ORDER_ATOMIC) || 0;
|
var lng = Blockly.Arduino.valueToCode(this, 'LNG', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
var lng =
|
var alt = Blockly.Arduino.valueToCode(this, 'ALT', Blockly.Arduino.ORDER_ATOMIC) || 0
|
||||||
Blockly.Arduino.valueToCode(this, "LNG", Blockly.Arduino.ORDER_ATOMIC) || 0;
|
var channel = this.getFieldValue('CHANNEL');
|
||||||
var alt =
|
var code = `lpp.addGPS(${channel}, ${lat}, ${lng}, ${alt});\n`
|
||||||
Blockly.Arduino.valueToCode(this, "ALT", Blockly.Arduino.ORDER_ATOMIC) || 0;
|
return code;
|
||||||
var channel = this.getFieldValue("CHANNEL");
|
}
|
||||||
var code = `lpp.addGPS(${channel}, ${lat}, ${lng}, ${alt});\n`;
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
@@ -1,125 +1,63 @@
|
|||||||
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 =
|
var sensor_value = Blockly.Arduino.valueToCode(this, 'Value', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"';
|
||||||
Blockly.Arduino.valueToCode(this, "Value", Blockly.Arduino.ORDER_ATOMIC) ||
|
Blockly.Arduino.definitions_['SENSOR_ID' + id + ''] = 'const char SENSOR_ID' + id + '[] PROGMEM = "' + sensor_id + '";';
|
||||||
'"Keine Eingabe"';
|
code += 'addMeasurement(SENSOR_ID' + id + ',' + sensor_value + ');\n';
|
||||||
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 workspace = Blockly.getMainWorkspace();
|
var box_id = this.getFieldValue('BoxID');
|
||||||
var wifi = false;
|
var host = this.getFieldValue('host');
|
||||||
var ethernet = false;
|
var branch = Blockly.Arduino.statementToCode(Block, 'DO');
|
||||||
if (workspace.getBlocksByType("sensebox_wifi").length > 0) {
|
//var blocks = Blockly.Block.getDescendants;
|
||||||
wifi = true;
|
var type = this.getFieldValue('type');
|
||||||
ethernet = false;
|
var ssl = this.getFieldValue('SSL');
|
||||||
} 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 type = this.getFieldValue("type");
|
|
||||||
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) {
|
// 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;
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.definitions_["num_sensors"] =
|
|
||||||
"static const uint8_t NUM_SENSORS = " + num_sensors + ";";
|
|
||||||
Blockly.Arduino.definitions_["SenseBoxID"] =
|
|
||||||
'const char SENSEBOX_ID [] PROGMEM = "' + box_id + '";';
|
|
||||||
Blockly.Arduino.definitions_["host"] =
|
|
||||||
'const char server [] PROGMEM ="ingress.opensensemap.org";';
|
|
||||||
if (wifi === true) {
|
|
||||||
if (ssl === "TRUE") {
|
|
||||||
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.setupCode_["timeClient_begin"] = "timeClient.begin();";
|
// }
|
||||||
Blockly.Arduino.setupCode_["initBearSSL"] =
|
// }
|
||||||
"ArduinoBearSSL.onGetTime(getTime);";
|
var num_sensors = count;
|
||||||
port = 443;
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
} else if (ssl === "FALSE") {
|
Blockly.Arduino.definitions_['num_sensors'] = 'static const uint8_t NUM_SENSORS = ' + num_sensors + ';'
|
||||||
Blockly.Arduino.definitions_["EthernetClient"] = "EthernetClient client;";
|
Blockly.Arduino.definitions_['SenseBoxID'] = 'const char SENSEBOX_ID [] PROGMEM = "' + box_id + '";';
|
||||||
port = 80;
|
Blockly.Arduino.definitions_['host'] = 'const char server [] PROGMEM =' + host + ';';
|
||||||
}
|
if (ssl === 'TRUE') {
|
||||||
|
Blockly.Arduino.definitions_['WiFiSSLClient'] = 'WiFiSSLClient client;';
|
||||||
|
port = 443;
|
||||||
|
} else if (ssl === 'FALSE') {
|
||||||
|
Blockly.Arduino.definitions_['WiFiClient'] = 'WiFiClient client;';
|
||||||
|
port = 80;
|
||||||
}
|
}
|
||||||
Blockly.Arduino.definitions_["measurement"] = `typedef struct measurement {
|
|
||||||
|
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_[
|
Blockly.Arduino.definitions_['num_measurement'] = `measurement measurements[NUM_SENSORS];
|
||||||
"num_measurement"
|
|
||||||
] = `measurement measurements[NUM_SENSORS];
|
|
||||||
uint8_t num_measurements = 0;`;
|
uint8_t num_measurements = 0;`;
|
||||||
Blockly.Arduino.definitions_["lengthMultiplikator"] =
|
Blockly.Arduino.definitions_['lengthMultiplikator'] = 'const int lengthMultiplikator = 35;';
|
||||||
"const int lengthMultiplikator = 35;";
|
Blockly.Arduino.functionNames_['addMeasurement'] = `
|
||||||
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++) {
|
||||||
@@ -131,30 +69,22 @@ unsigned long getTime() {
|
|||||||
// 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(1000);
|
delay(10);
|
||||||
}
|
}
|
||||||
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, ` +
|
connected = client.connect(_server, `+ port + `);
|
||||||
port +
|
|
||||||
`);
|
|
||||||
if (connected == true) {
|
if (connected == true) {
|
||||||
// construct the HTTP POST request:
|
// construct the HTTP POST request:
|
||||||
sprintf_P(buffer,
|
sprintf_P(buffer,
|
||||||
PSTR("POST /boxes/%s/data HTTP/1.1\\nAuthorization: ${access_token}\\nHost: %s\\nContent-Type: "
|
PSTR("POST /boxes/%s/data HTTP/1.1\\nHost: %s\\nContent-Type: "
|
||||||
"text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"),
|
"text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"),
|
||||||
SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
|
SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
|
||||||
// send the HTTP POST request:
|
// send the HTTP POST request:
|
||||||
@@ -172,56 +102,22 @@ ${
|
|||||||
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") {
|
}
|
||||||
var lat = Blockly.Arduino.valueToCode(
|
else if (type === 'Mobile') {
|
||||||
Block,
|
var lat = Blockly.Arduino.valueToCode(Block, 'lat', Blockly.Arduino.ORDER_ATOMIC);
|
||||||
"lat",
|
var lng = Blockly.Arduino.valueToCode(Block, 'lng', Blockly.Arduino.ORDER_ATOMIC);
|
||||||
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);
|
||||||
var lng = Blockly.Arduino.valueToCode(
|
Blockly.Arduino.definitions_['lengthMultiplikator'] = 'const int lengthMultiplikator = 77;';
|
||||||
Block,
|
Blockly.Arduino.functionNames_['writeMeasurementsToClient'] = `
|
||||||
"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++) {
|
||||||
@@ -233,10 +129,7 @@ ${
|
|||||||
// reset num_measurements
|
// reset num_measurements
|
||||||
num_measurements = 0;
|
num_measurements = 0;
|
||||||
}`;
|
}`;
|
||||||
Blockly.Arduino.variables_["latitude"] = "float latitude;";
|
Blockly.Arduino.functionNames_['submitValues'] = `
|
||||||
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();
|
||||||
@@ -247,13 +140,11 @@ ${
|
|||||||
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, ` +
|
connected = client.connect(_server, `+ port + `);
|
||||||
port +
|
|
||||||
`);
|
|
||||||
if (connected == true) {
|
if (connected == true) {
|
||||||
// construct the HTTP POST request:
|
// construct the HTTP POST request:
|
||||||
sprintf_P(buffer,
|
sprintf_P(buffer,
|
||||||
PSTR("POST /boxes/%s/data HTTP/1.1\\nAuthorization: ${access_token}\\nHost: %s\\nContent-Type: "
|
PSTR("POST /boxes/%s/data HTTP/1.1\\nHost: %s\\nContent-Type: "
|
||||||
"text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"),
|
"text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"),
|
||||||
SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
|
SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
|
||||||
// send the HTTP POST request:
|
// send the HTTP POST request:
|
||||||
@@ -271,40 +162,15 @@ ${
|
|||||||
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 +=
|
code += 'submitValues(' + lat + ',' + lng + ',' + altitude + ',' + timestamp + ');\n';
|
||||||
"submitValues((" +
|
|
||||||
lat +
|
|
||||||
"/float(10000000)),(" +
|
|
||||||
lng +
|
|
||||||
"/float(10000000)),(" +
|
|
||||||
altitude +
|
|
||||||
"/float(100))," +
|
|
||||||
timestamp +
|
|
||||||
");\n";
|
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
import Blockly from "blockly";
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_rtc_init = function () {
|
|
||||||
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
|
|
||||||
Blockly.Arduino.definitions_["RTC"] = `RV8523 rtc;`;
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.setupCode_["rtc.begin"] = `rtc.begin();`;
|
|
||||||
var code = ``;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_rtc_set = function () {
|
|
||||||
var second =
|
|
||||||
Blockly.Arduino.valueToCode(this, "second", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"0";
|
|
||||||
var minutes =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"minutes",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
) || "0";
|
|
||||||
var hour =
|
|
||||||
Blockly.Arduino.valueToCode(this, "hour", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"0";
|
|
||||||
var day =
|
|
||||||
Blockly.Arduino.valueToCode(this, "day", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"0";
|
|
||||||
var month =
|
|
||||||
Blockly.Arduino.valueToCode(this, "month", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"0";
|
|
||||||
var year =
|
|
||||||
Blockly.Arduino.valueToCode(this, "year", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
"0";
|
|
||||||
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
|
|
||||||
Blockly.Arduino.setupCode_["rtc.start"] = `rtc.start();`;
|
|
||||||
Blockly.Arduino.setupCode_[
|
|
||||||
"rtc.batterySwitchOver"
|
|
||||||
] = `rtc.batterySwitchOver(1);`;
|
|
||||||
Blockly.Arduino.setupCode_[
|
|
||||||
"rtc.set"
|
|
||||||
] = `rtc.set(${second}, ${minutes}, ${hour}, ${day}, ${month}, ${year});`;
|
|
||||||
var code = ``;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_rtc_ntp = function () {
|
|
||||||
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
|
|
||||||
Blockly.Arduino.setupCode_["rtc.start"] = `rtc.start();`;
|
|
||||||
Blockly.Arduino.setupCode_[
|
|
||||||
"rtc.batterySwitchOver"
|
|
||||||
] = `rtc.batterySwitchOver(1);`;
|
|
||||||
Blockly.Arduino.setupCode_[
|
|
||||||
"rtc.set"
|
|
||||||
] = `rtc.set(SECOND, MINUTE, HOUR, DAY, MONTH, YEAR);`;
|
|
||||||
var code = ``;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_rtc_get = function () {
|
|
||||||
var dropdown = this.getFieldValue("dropdown");
|
|
||||||
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
|
|
||||||
Blockly.Arduino.setupCode_["rtc.start"] = `rtc.start();`;
|
|
||||||
Blockly.Arduino.setupCode_[
|
|
||||||
"rtc.batterySwitchOver"
|
|
||||||
] = `rtc.batterySwitchOver(1);`;
|
|
||||||
Blockly.Arduino.loopCodeOnce_[
|
|
||||||
"rtc_variables"
|
|
||||||
] = `uint8_t sec, min, hour, day, month;\nuint16_t year;`;
|
|
||||||
|
|
||||||
Blockly.Arduino.loopCodeOnce_[
|
|
||||||
"rtc_get"
|
|
||||||
] = `rtc.get(&sec, &min, &hour, &day, &month, &year);`;
|
|
||||||
|
|
||||||
var code = `${dropdown}`;
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_rtc_get_timestamp = function () {
|
|
||||||
Blockly.Arduino.libraries_["RV8523"] = `#include <RV8523.h>`;
|
|
||||||
Blockly.Arduino.setupCode_["rtc.start"] = `rtc.start();`;
|
|
||||||
Blockly.Arduino.setupCode_[
|
|
||||||
"rtc.batterySwitchOver"
|
|
||||||
] = `rtc.batterySwitchOver(1);`;
|
|
||||||
Blockly.Arduino.variables_["rtc_timestamp"] = `char timestamp[20];`;
|
|
||||||
Blockly.Arduino.codeFunctions_["getTimeStamp"] = `
|
|
||||||
char* getTimeStamp() {
|
|
||||||
uint8_t sec, min, hour, day, month;
|
|
||||||
uint16_t year;
|
|
||||||
rtc.get(&sec, &min, &hour, &day, &month, &year);
|
|
||||||
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];
|
|
||||||
};
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import Blockly from "blockly";
|
import Blockly from 'blockly';
|
||||||
|
|
||||||
|
|
||||||
/* SD-Card Blocks using the Standard SD Library*/
|
/* SD-Card Blocks using the Standard SD Library*/
|
||||||
/**
|
/**
|
||||||
@@ -9,200 +10,45 @@ 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 extension = this.getFieldValue("extension");
|
var res = filename.slice(0, 4);
|
||||||
var newFileName = filename.concat(".", extension);
|
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.definitions_['define_' + res] = 'File dataFile' + res + ';';
|
||||||
Blockly.Arduino.definitions_["define_" + filename] = `File ${filename};`;
|
Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);';
|
||||||
Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);\n";
|
Blockly.Arduino.setupCode_['sensebox_sd' + filename] = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\ndataFile' + res + '.close();\n';
|
||||||
Blockly.Arduino.setupCode_[
|
var code = '';
|
||||||
"sensebox_sd" + filename
|
return code;
|
||||||
] = `${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 extension = this.getFieldValue("extension");
|
var res = filename.slice(0, 4);
|
||||||
var newFileName = filename.concat(".", extension);
|
var branch = Blockly.Arduino.statementToCode(block, 'SD');
|
||||||
var branch = Blockly.Arduino.statementToCode(block, "SD");
|
var code = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\n'
|
||||||
var code = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n`;
|
code += branch;
|
||||||
code += branch;
|
code += 'dataFile' + res + '.close();\n'
|
||||||
code += `${filename}.close();\n`;
|
return code;
|
||||||
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 branch =
|
|
||||||
Blockly.Arduino.valueToCode(this, "DATA", Blockly.Arduino.ORDER_ATOMIC) ||
|
|
||||||
'"Keine Eingabe"';
|
|
||||||
var linebreak = this.getFieldValue("linebreak");
|
|
||||||
if (linebreak === "TRUE") {
|
|
||||||
linebreak = "ln";
|
|
||||||
} else {
|
|
||||||
linebreak = "";
|
|
||||||
}
|
|
||||||
var code = "";
|
|
||||||
if (branch === "gps.getLongitude()" || branch === "gps.getLatitude()") {
|
|
||||||
code = `${filename}.print${linebreak}(${branch},5);\n`;
|
|
||||||
} else {
|
|
||||||
code = `${filename}.print${linebreak}(${branch});\n`;
|
|
||||||
}
|
|
||||||
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 res = filename.slice(0, 4);
|
||||||
var num_sensors = count;
|
var text = Blockly.Arduino.valueToCode(this, 'DATA', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"';
|
||||||
var timestamp = Blockly.Arduino.valueToCode(
|
var linebreak = this.getFieldValue('linebreak');
|
||||||
this,
|
if (linebreak === "TRUE") {
|
||||||
"timeStamp",
|
linebreak = "ln";
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
} else {
|
||||||
);
|
linebreak = "";
|
||||||
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++;
|
|
||||||
}
|
}
|
||||||
`;
|
var code = '';
|
||||||
Blockly.Arduino.functionNames_["writeMeasurementsToSdCard"] = `
|
if (text === "gps.getLongitude()" || text === "gps.getLatitude()") {
|
||||||
void writeMeasurementsToSdCard(char* timeStamp) {
|
code = 'dataFile' + res + '.print' + linebreak + '(' + text + ',5);\n'
|
||||||
// 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
|
else {
|
||||||
num_measurements = 0;
|
code = 'dataFile' + res + '.print' + linebreak + '(' + text + ');\n'
|
||||||
}
|
|
||||||
`;
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
`;
|
return code;
|
||||||
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";
|
|
||||||
console.log(code);
|
|
||||||
return code;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Blockly from "blockly";
|
import Blockly from 'blockly';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HDC1080 Temperature and Humidity Sensor
|
* HDC1080 Temperature and Humidity Sensor
|
||||||
@@ -6,14 +6,11 @@ import Blockly from "blockly";
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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.libraries_["library_adafruithdc1000"] =
|
Blockly.Arduino.definitions_['define_hdc'] = 'HDC1080 hdc;';
|
||||||
"#include <Adafruit_HDC1000.h> // http://librarymanager/All#Adafruit_HDC1000_Library";
|
Blockly.Arduino.setupCode_['sensebox_sensor_temp_hum'] = 'hdc.begin();';
|
||||||
Blockly.Arduino.definitions_["define_hdc"] =
|
var code = 'hdc.get' + dropdown_name + '()';
|
||||||
"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];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -23,125 +20,35 @@ Blockly.Arduino.sensebox_sensor_temp_hum = function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
|
if (dropdown_name === 'UvIntensity') {
|
||||||
if (dropdown_name === "UvIntensity") {
|
Blockly.Arduino.definitions_['define_veml'] = 'VEML6070 veml;'
|
||||||
Blockly.Arduino.libraries_["library_veml6070"] = "#include <VEML6070.h>";
|
Blockly.Arduino.setupCode_['sensebox_sensor_uv_light'] = 'veml.begin();'
|
||||||
Blockly.Arduino.definitions_["define_veml"] = "VEML6070 veml;";
|
code = 'veml.get' + dropdown_name + '()';
|
||||||
Blockly.Arduino.setupCode_["sensebox_sensor_uv_light"] = "veml.begin();";
|
|
||||||
code = "veml.getUV()";
|
|
||||||
}
|
}
|
||||||
if (dropdown_name === "Illuminance") {
|
if (dropdown_name === 'Illuminance') {
|
||||||
Blockly.Arduino.libraries_["library_ltr329"] = `#include <LTR329.h>`;
|
Blockly.Arduino.definitions_['define_tsl'] = 'TSL45315 tsl;'
|
||||||
Blockly.Arduino.libraries_["library_wire"] = "#include <Wire.h>";
|
Blockly.Arduino.setupCode_['sensebox_sensor_illuminance'] = 'tsl.begin();'
|
||||||
Blockly.Arduino.codeFunctions_["read_reg"] = `
|
code = 'tsl.get' + dropdown_name + '()';
|
||||||
int read_reg(byte address, uint8_t reg)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
Wire.beginTransmission(address);
|
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_["library_bmx055"] = `#include <BMX055.h>`;
|
Blockly.Arduino.definitions_['define_bmx'] = 'BMX055 bmx;';
|
||||||
Blockly.Arduino.definitions_["define_bmx"] = "BMX055 bmx;";
|
Blockly.Arduino.setupCode_['sensebox_sensor_bmx055'] = 'bmx.beginAcc(' + range + ');';
|
||||||
Blockly.Arduino.setupCode_["sensebox_sensor_bmx055"] =
|
var code = 'bmx.getAcceleration' + dropdown_value + '()';
|
||||||
"bmx.beginAcc(" + range + ");";
|
|
||||||
var code = "bmx.getAcceleration" + dropdown_value + "()";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -151,21 +58,13 @@ Blockly.Arduino.sensebox_sensor_bmx055_accelerometer = function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_[
|
Blockly.Arduino.codeFunctions_['define_sds011'] = 'SDS011 my_sds(' + serial_name + ');';
|
||||||
"SdsDustSensor"
|
Blockly.Arduino.variables_['variables_sds011'] = 'float p10,p25;\n';
|
||||||
] = `#include <SdsDustSensor.h> // http://librarymanager/All#Nova_Fitness_Sds_dust_sensors_library`;
|
Blockly.Arduino.setupCode_['sensebox_sensor_sds011'] = serial_name + '.begin(9600);';
|
||||||
Blockly.Arduino.definitions_["define_sds011"] =
|
var code = 'my_sds.get' + dropdown_name + '()';
|
||||||
"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];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -175,60 +74,42 @@ Blockly.Arduino.sensebox_sensor_sds011 = function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_[
|
Blockly.Arduino.definitions_['define_pressure'] = 'BMP280 bmp_sensor;';
|
||||||
"adafruit_bmp280"
|
Blockly.Arduino.setupCode_['sensebox_bmp_sensor'] = 'bmp_sensor.begin();';
|
||||||
] = `#include <Adafruit_BMP280.h> // http://librarymanager/All#Adafruit_BMP280_Library`;
|
if (dropdown_name === 'Pressure' || dropdown_name === 'Temperature') {
|
||||||
Blockly.Arduino.definitions_["define_pressure"] = "Adafruit_BMP280 bmp;";
|
code = 'bmp_sensor.get' + dropdown_name + '()';
|
||||||
Blockly.Arduino.setupCode_["sensebox_bmp_sensor"] = "bmp.begin(0x76);";
|
}
|
||||||
Blockly.Arduino.setupCode_["bmp_setSampling"] = `
|
else if (dropdown_name === 'Altitude') {
|
||||||
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
|
code = 'bmp_sensor.getAltitude(' + referencePressure + ')';
|
||||||
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 () {
|
|
||||||
var dropdown_name = this.getFieldValue("dropdown");
|
|
||||||
let code = "";
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.libraries_["library_bsec"] =
|
|
||||||
"#include <bsec.h> // http://librarymanager/All#BSEC_Software_Library";
|
|
||||||
Blockly.Arduino.definitions_["bsec_iaqSensor"] = "Bsec iaqSensor;";
|
|
||||||
Blockly.Arduino.variables_["bmeTemperatur"] = "float bmeTemperatur;";
|
|
||||||
Blockly.Arduino.variables_["bmeHumidity"] = "float bmeHumidity;";
|
|
||||||
Blockly.Arduino.variables_["bmePressure"] = "double bmePressure;";
|
|
||||||
Blockly.Arduino.variables_["bmeIAQ"] = "float bmeIAQ;";
|
|
||||||
Blockly.Arduino.variables_["bmeIAQAccuracy"] = "float bmeIAQAccuracy;";
|
|
||||||
Blockly.Arduino.variables_["bmeCO2"] = "int bmeCO2;";
|
|
||||||
Blockly.Arduino.variables_["bmeBreathVocEquivalent"] =
|
|
||||||
"float bmeBreathVocEquivalent;";
|
|
||||||
|
|
||||||
Blockly.Arduino.functionNames_["checkIaqSensorStatus"] = `
|
Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
|
||||||
|
var dropdown_name = this.getFieldValue('dropdown');
|
||||||
|
let code = '';
|
||||||
|
Blockly.Arduino.libraries_['library_bsec'] = '#include "bsec.h"';
|
||||||
|
Blockly.Arduino.definitions_['bsec_iaqSensor'] = 'Bsec iaqSensor;'
|
||||||
|
Blockly.Arduino.variables_['bmeTemperatur'] = 'float bmeTemperatur;';
|
||||||
|
Blockly.Arduino.variables_['bmeHumidity'] = 'float bmeHumidity;';
|
||||||
|
Blockly.Arduino.variables_['bmePressure'] = 'double bmePressure;';
|
||||||
|
Blockly.Arduino.variables_['bmeIAQ'] = 'float bmeIAQ;';
|
||||||
|
Blockly.Arduino.variables_['bmeIAQAccuracy'] = 'float bmeIAQAccuracy;';
|
||||||
|
Blockly.Arduino.variables_['bmeCO2'] = 'int bmeCO2;';
|
||||||
|
Blockly.Arduino.variables_['bmeBreathVocEquivalent'] = 'float bmeBreathVocEquivalent;'
|
||||||
|
|
||||||
|
Blockly.Arduino.functionNames_['checkIaqSensorStatus'] = `
|
||||||
void checkIaqSensorStatus(void)
|
void checkIaqSensorStatus(void)
|
||||||
{
|
{
|
||||||
if (iaqSensor.status != BSEC_OK) {
|
if (iaqSensor.status != BSEC_OK) {
|
||||||
@@ -246,7 +127,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);
|
||||||
@@ -256,12 +137,10 @@ 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"] =
|
Blockly.Arduino.setupCode_['iaqSensor.begin'] = 'iaqSensor.begin(BME680_I2C_ADDR_PRIMARY, Wire);';
|
||||||
"iaqSensor.begin(BME680_I2C_ADDR_PRIMARY, Wire);";
|
Blockly.Arduino.setupCode_['checkIaqSensorStatus'] = 'checkIaqSensorStatus();';
|
||||||
Blockly.Arduino.setupCode_["checkIaqSensorStatus"] =
|
Blockly.Arduino.setupCode_['bsec_sensorlist'] = `
|
||||||
"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,
|
||||||
@@ -275,10 +154,9 @@ Blockly.Arduino.sensebox_sensor_bme680_bsec = function () {
|
|||||||
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
|
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
|
||||||
};
|
};
|
||||||
`;
|
`;
|
||||||
Blockly.Arduino.setupCode_["iaqSensorUpdateSubscription"] =
|
Blockly.Arduino.setupCode_['iaqSensorUpdateSubscription'] = 'iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);\ncheckIaqSensorStatus();';
|
||||||
"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;
|
||||||
@@ -292,26 +170,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;
|
||||||
@@ -319,30 +197,20 @@ 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');
|
||||||
var maxDistance = this.getFieldValue("maxDistance");
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.definitions_['var_ultrasonic' + port] = 'Ultrasonic Ultrasonic' + port + '(' + dropdown_pin_RX + ',' + dropdown_pin_TX + ');';
|
||||||
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 = `sonar${port}.ping_cm()`;
|
code = 'Ultrasonic' + port + '.getDistance()';
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -352,67 +220,35 @@ Blockly.Arduino.sensebox_sensor_ultrasonic_ranger = function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.codeFunctions_["define_sound"] = `
|
Blockly.Arduino.definitions_['define_microphone'] = 'Microphone microphone(' + dropdown_pin + ');'
|
||||||
float getSoundValue(int pin) {
|
var code = 'microphone.getValue()';
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_[
|
Blockly.Arduino.definitions_['define_button' + dropdown_pin + ''] = 'Button button_' + dropdown_pin + '(' + dropdown_pin + ');';
|
||||||
"library_jcButtons"
|
Blockly.Arduino.setupCode_['setup_button' + dropdown_pin + ''] = 'button_' + dropdown_pin + '.begin();';
|
||||||
] = `#include <JC_Button.h> // http://librarymanager/All#JC_Button`;
|
var code = '';
|
||||||
Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
|
if (dropown_function === 'isPressed') {
|
||||||
"Button button_" + dropdown_pin + "(" + dropdown_pin + ");";
|
code = 'button_' + dropdown_pin + '.isPressed()';
|
||||||
Blockly.Arduino.setupCode_["setup_button" + dropdown_pin + ""] =
|
}
|
||||||
"button_" + dropdown_pin + ".begin();";
|
else if (dropown_function === 'Switch') {
|
||||||
Blockly.Arduino.loopCodeOnce_["loop_button" + dropdown_pin + ""] =
|
code = 'button_' + dropdown_pin + '.getSwitch()';
|
||||||
"button_" + dropdown_pin + ".read();";
|
}
|
||||||
var code = "";
|
else if (dropown_function === 'wasPressed') {
|
||||||
if (dropown_function === "isPressed") {
|
code = 'button_' + dropdown_pin + '.wasPressed()';
|
||||||
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 + ")";
|
|
||||||
}
|
}
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
||||||
};
|
};
|
||||||
@@ -423,289 +259,40 @@ Blockly.Arduino.sensebox_button = function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_scd30 = function () {
|
Blockly.Arduino.sensebox_scd30 = function () {
|
||||||
var dropdown = this.getFieldValue("dropdown");
|
var dropdown = this.getFieldValue('dropdown');
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['scd30_library'] = '#include "SparkFun_SCD30_Arduino_Library.h"'
|
||||||
Blockly.Arduino.libraries_["scd30_library"] =
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
"#include <SparkFun_SCD30_Arduino_Library.h> // http://librarymanager/All#SparkFun_SCD30_Arduino_Library";
|
Blockly.Arduino.definitions_['SCD30'] = 'SCD30 airSensor;';
|
||||||
Blockly.Arduino.definitions_["SCD30"] = "SCD30 airSensor;";
|
Blockly.Arduino.variables_['scd30_temp'] = 'float scd30_temp;';
|
||||||
Blockly.Arduino.setupCode_["init_scd30"] = ` Wire.begin();
|
Blockly.Arduino.variables_['scd30_humi'] = 'float scd30_humi;';
|
||||||
|
Blockly.Arduino.variables_['scd30_co2'] = 'float scd30_co2;';
|
||||||
|
Blockly.Arduino.setupCode_['init_scd30'] = ` Wire.begin();
|
||||||
if (airSensor.begin() == false)
|
if (airSensor.begin() == false)
|
||||||
{
|
{
|
||||||
|
Serial.println("Air sensor not detected. Please check wiring. Freezing...");
|
||||||
while (1)
|
while (1)
|
||||||
;
|
;
|
||||||
}`;
|
}`;
|
||||||
var code = "";
|
Blockly.Arduino.loopCodeOnce_['scd30_getData'] = `if (airSensor.dataAvailable())
|
||||||
switch (dropdown) {
|
|
||||||
case "temperature":
|
|
||||||
code = "airSensor.getTemperature()";
|
|
||||||
break;
|
|
||||||
case "humidity":
|
|
||||||
code = "airSensor.getHumidity()";
|
|
||||||
break;
|
|
||||||
case "CO2":
|
|
||||||
code = "airSensor.getCO2()";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
code = "";
|
|
||||||
}
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GPS Module
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_gps = function () {
|
|
||||||
var dropdown = this.getFieldValue("dropdown");
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.libraries_["gps_library"] =
|
|
||||||
"#include <SparkFun_u-blox_GNSS_Arduino_Library.h> // http://librarymanager/All#SparkFun_u-blox_GNSS_Arduino_Library";
|
|
||||||
Blockly.Arduino.libraries_["library_wire"] = "#include <Wire.h>";
|
|
||||||
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
|
|
||||||
{
|
{
|
||||||
Serial.println(F("Ublox GPS not detected at default I2C address. Please check wiring. Freezing."));
|
scd30_co2 = airSensor.getCO2();
|
||||||
while (1);
|
scd30_temp = airSensor.getTemperature();
|
||||||
}
|
scd30_humi = airSensor.getHumidity();
|
||||||
|
}`
|
||||||
myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)
|
var code = '';
|
||||||
myGNSS.saveConfiguration(); //Save the current settings to flash and BBR`;
|
|
||||||
var code = "";
|
|
||||||
switch (dropdown) {
|
switch (dropdown) {
|
||||||
case "latitude":
|
case 'temperature':
|
||||||
code = "myGNSS.getLatitude()";
|
code = 'scd30_temp';
|
||||||
break;
|
break;
|
||||||
case "longitude":
|
case 'humidity':
|
||||||
code = "myGNSS.getLongitude()";
|
code = 'scd30_humi';
|
||||||
break;
|
break;
|
||||||
case "altitude":
|
case 'CO2':
|
||||||
code = "myGNSS.getAltitudeMSL()";
|
code = 'scd30_co2';
|
||||||
break;
|
break;
|
||||||
case "pDOP":
|
default:
|
||||||
code = "myGNSS.getPDOP()";
|
code = ''
|
||||||
break;
|
}
|
||||||
case "fixType":
|
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
||||||
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;
|
|
||||||
default:
|
|
||||||
code = "";
|
|
||||||
}
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block for Truebner STM50
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_sensor_truebner_smt50 = function () {
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
var dropdown_port = this.getFieldValue("Port");
|
|
||||||
var dropdown_value = this.getFieldValue("value");
|
|
||||||
var dropdown_pin = 1;
|
|
||||||
var code = "";
|
|
||||||
if (dropdown_value === "temp") {
|
|
||||||
if (dropdown_port === "A") {
|
|
||||||
dropdown_pin = 1;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "B") {
|
|
||||||
dropdown_pin = 3;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "C") {
|
|
||||||
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}";
|
|
||||||
code = "getSMT50Temperature(" + dropdown_pin + ")";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
} else if (dropdown_value === "soil") {
|
|
||||||
if (dropdown_port === "A") {
|
|
||||||
dropdown_pin = 2;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "B") {
|
|
||||||
dropdown_pin = 4;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "C") {
|
|
||||||
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}";
|
|
||||||
code = "getSMT50Moisture(" + dropdown_pin + ")";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DS18B20 Watertemperature
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_sensor_watertemperature = function () {
|
|
||||||
var dropdown_port = this.getFieldValue("Port");
|
|
||||||
var dropdown_pin = 1;
|
|
||||||
if (dropdown_port === "A") {
|
|
||||||
dropdown_pin = 1;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "B") {
|
|
||||||
dropdown_pin = 3;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "C") {
|
|
||||||
dropdown_pin = 5;
|
|
||||||
}
|
|
||||||
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];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Windspeed
|
|
||||||
* remove for now
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_windspeed = function () {
|
|
||||||
var dropdown_pin = this.getFieldValue('PIN');
|
|
||||||
Blockly.Arduino.codeFunctions_['windspeed'] = `
|
|
||||||
float getWindspeed(){
|
|
||||||
float voltageWind = analogRead(`+ dropdown_pin + `) * (3.3 / 1024.0);
|
|
||||||
float windspeed = 0.0;
|
|
||||||
if (voltageWind >= 0.018){
|
|
||||||
float poly1 = pow(voltageWind, 3);
|
|
||||||
poly1 = 17.0359801998299 * poly1;
|
|
||||||
float poly2 = pow(voltageWind, 2);
|
|
||||||
poly2 = 47.9908168343362 * poly2;
|
|
||||||
float poly3 = 122.899677524413 * voltageWind;
|
|
||||||
float poly4 = 0.657504127272728;
|
|
||||||
windspeed = poly1 - poly2 + poly3 - poly4;
|
|
||||||
windspeed = windspeed * 0.2777777777777778; //conversion in m/s
|
|
||||||
}
|
|
||||||
return windspeed;
|
|
||||||
}`
|
|
||||||
var code = 'getWindspeed()';
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DF Robot Soundsensor
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_soundsensor_dfrobot = function () {
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
var dropdown_port = this.getFieldValue("Port");
|
|
||||||
var dropdown_pin = 1;
|
|
||||||
if (dropdown_port === "A") {
|
|
||||||
dropdown_pin = 1;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "B") {
|
|
||||||
dropdown_pin = 3;
|
|
||||||
}
|
|
||||||
if (dropdown_port === "C") {
|
|
||||||
dropdown_pin = 5;
|
|
||||||
}
|
|
||||||
Blockly.Arduino.codeFunctions_["soundsensor"] =
|
|
||||||
`
|
|
||||||
float getSoundValue(){
|
|
||||||
float v = analogRead(` +
|
|
||||||
dropdown_pin +
|
|
||||||
`) * (3.3 / 1024.0);
|
|
||||||
float decibel = v * 50;
|
|
||||||
return decibel;
|
|
||||||
}`;
|
|
||||||
var code = "getSoundValue()";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rainsensor hydreon rg-15
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_rainsensor_hydreon_rg15 = function () {
|
|
||||||
var port = this.getFieldValue("SERIAL");
|
|
||||||
var value = this.getFieldValue("VALUE");
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.libraries_["library_rainsensor_rg15"] = "#include <hydreon.h>";
|
|
||||||
Blockly.Arduino.definitions_["def_rainsensor_rg15_" + port] = "HYDREON rainsensor_" + port + "(" + port + ");";
|
|
||||||
Blockly.Arduino.setupCode_["setup_rainsensor_rg15_" + port] = "rainsensor_" + port + ".begin();";
|
|
||||||
Blockly.Arduino.loopCodeOnce_["loop_rainsensor_rg15_" + port] = "rainsensor_" + port + ".readAllData();"
|
|
||||||
|
|
||||||
var code = "rainsensor_" + port + "." + value + "()";
|
|
||||||
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];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,40 +1,29 @@
|
|||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly['Arduino'].libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly["Arduino"].libraries_[
|
Blockly['Arduino'].libraries_['library_telegram'] = `#include <UniversalTelegramBot.h>`
|
||||||
"library_telegram"
|
Blockly['Arduino'].functionNames_['WiFiSSLClient'] = 'WiFiSSLClient client;';
|
||||||
] = `#include <UniversalTelegramBot.h>`;
|
Blockly['Arduino'].functionNames_['telegram_objects'] = `#define BOTtoken "${token}" // your Bot Token (Get from Botfather)
|
||||||
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(
|
var messageProcessing = Blockly.Arduino.statementToCode(block, 'telegram_do', Blockly.Arduino.ORDER_ATOMIC);
|
||||||
block,
|
|
||||||
"telegram_do",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
|
|
||||||
Blockly.Arduino.definitions_[
|
Blockly.Arduino.definitions_['telegram_variables'] = `int Bot_mtbs = 1000; //mean time between scan messages
|
||||||
"telegram_variables"
|
long Bot_lasttime; //last time messages' scan has been done`
|
||||||
] = `int Bot_mtbs = 1000; //mean time between scan messages
|
|
||||||
long Bot_lasttime; //last time messages' scan has been done`;
|
|
||||||
|
|
||||||
Blockly.Arduino.loopCodeOnce_[
|
Blockly.Arduino.loopCodeOnce_['sensebox_telegram_loop'] = `if (millis() > Bot_lasttime + Bot_mtbs) {
|
||||||
"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++) {
|
||||||
@@ -47,17 +36,13 @@ 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(
|
var stuffToDo = Blockly.Arduino.statementToCode(block, 'telegram_do_on_message', Blockly.Arduino.ORDER_ATOMIC);
|
||||||
block,
|
|
||||||
"telegram_do_on_message",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var code = `
|
var code = `
|
||||||
if (text == "${message}") {
|
if (text == "${message}") {
|
||||||
${stuffToDo}
|
${stuffToDo}
|
||||||
@@ -66,12 +51,7 @@ 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 =
|
var textToSend = Blockly.Arduino.valueToCode(this, 'telegram_text_to_send', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"';
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,112 +1,25 @@
|
|||||||
import Blockly from "blockly";
|
import Blockly from 'blockly';
|
||||||
|
|
||||||
|
|
||||||
/* 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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_["library_WiFi"] = "#include <WiFi101.h>";
|
Blockly.Arduino.definitions_['define_network'] = 'Bee* b = new Bee();';
|
||||||
Blockly.Arduino.variables_["ssid"] = `char ssid[] = "${ssid}";`;
|
if (pw === "") {
|
||||||
Blockly.Arduino.variables_["pass"] = `char pass[] = "${pw}";`;
|
Blockly.Arduino.setupCode_['sensebox_network'] = 'b->connectToWifi("' + ssid + '");\ndelay(1000);';
|
||||||
Blockly.Arduino.variables_["wifi_Status"] = "int status = WL_IDLE_STATUS;";
|
} else
|
||||||
if (pw === "") {
|
Blockly.Arduino.setupCode_['sensebox_network'] = 'b->connectToWifi("' + ssid + '","' + pw + '");\ndelay(1000);';
|
||||||
Blockly.Arduino.setupCode_["wifi_begin"] = `
|
var code = '';
|
||||||
if (WiFi.status() == WL_NO_SHIELD) {
|
return code;
|
||||||
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_senseBoxIO"] = "#include <senseBoxIO.h>";
|
Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"';
|
||||||
Blockly.Arduino.libraries_["library_WiFi"] = "#include <WiFi101.h>";
|
Blockly.Arduino.definitions_['define_network'] = 'Bee* b = new Bee();';
|
||||||
Blockly.Arduino.setupCode_["wifi_startAP"] = `WiFi.beginAP(${ssid});`;
|
Blockly.Arduino.setupCode_['sensebox_network'] = 'b->startAP("' + 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];
|
|
||||||
};
|
};
|
||||||
@@ -1,38 +1,3 @@
|
|||||||
import * as Blockly from "blockly/core";
|
import * as Blockly from 'blockly/core';
|
||||||
|
import { Block } from 'blockly';
|
||||||
|
|
||||||
/*
|
|
||||||
* Multiplexer
|
|
||||||
*/
|
|
||||||
Blockly.Arduino.sensebox_multiplexer_init = function () {
|
|
||||||
// Blockly.Arduino.libraries_['library_spi'] = '#include <SPI.h>';
|
|
||||||
var nrChannels =
|
|
||||||
Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"nrChannels",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
) | 0;
|
|
||||||
var array = [];
|
|
||||||
for (var i = 0; i < nrChannels; i++) {
|
|
||||||
array.push(i);
|
|
||||||
}
|
|
||||||
Blockly.Arduino.libraries_["library_wire"] = "#include <Wire.h>";
|
|
||||||
Blockly.Arduino.definitions_[
|
|
||||||
"define_multiplexer"
|
|
||||||
] = `byte multiplexAddress = 0x77;
|
|
||||||
byte channels[] = {${array}};`;
|
|
||||||
// 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_multiplexer_changeChannel = function () {
|
|
||||||
var channel = Blockly.Arduino.valueToCode(
|
|
||||||
this,
|
|
||||||
"Channel",
|
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
);
|
|
||||||
var code = `Wire.beginTransmission(0x77);
|
|
||||||
Wire.write(1 << channels[${channel - 1}]);
|
|
||||||
Wire.endTransmission();`;
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
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;
|
|
||||||
};
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
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).
|
||||||
@@ -6,11 +7,12 @@ 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.
|
||||||
@@ -20,37 +22,30 @@ 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 =
|
var argument0 = Blockly.Arduino.valueToCode(block, 'ADD0',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_UNARY_POSTFIX) || '""';
|
||||||
block,
|
code = 'String(' + argument0 + ')';
|
||||||
"ADD0",
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
Blockly.Arduino.ORDER_UNARY_POSTFIX
|
} else {
|
||||||
) || '""';
|
var argument;
|
||||||
code = "String(" + argument0 + ")";
|
code = [];
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
for (var n = 0; n < block.itemCount_; n++) {
|
||||||
} else {
|
argument = Blockly.Arduino.valueToCode(
|
||||||
var argument;
|
block, 'ADD' + n, Blockly.Arduino.ORDER_NONE);
|
||||||
code = [];
|
if (argument === '') {
|
||||||
for (var n = 0; n < block.itemCount_; n++) {
|
code[n] = '""';
|
||||||
argument = Blockly.Arduino.valueToCode(
|
} else {
|
||||||
block,
|
code[n] = 'String(' + argument + ')';
|
||||||
"ADD" + n,
|
}
|
||||||
Blockly.Arduino.ORDER_NONE
|
}
|
||||||
);
|
code = code.join(' + ');
|
||||||
if (argument === "") {
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
code[n] = '""';
|
|
||||||
} else {
|
|
||||||
code[n] = "String(" + argument + ")";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
code = code.join(" + ");
|
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,23 +55,18 @@ 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.nameDB_.getName(
|
var varName = Blockly.Arduino.variableDB_.getName(
|
||||||
block.getFieldValue("VAR"),
|
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
|
||||||
Blockly.Variables.NAME_TYPE
|
var argument0 = Blockly.Arduino.valueToCode(block, 'TEXT',
|
||||||
);
|
Blockly.Arduino.ORDER_UNARY_POSTFIX);
|
||||||
var argument0 = Blockly.Arduino.valueToCode(
|
if (argument0 === '') {
|
||||||
block,
|
argument0 = '""';
|
||||||
"TEXT",
|
} else {
|
||||||
Blockly.Arduino.ORDER_UNARY_POSTFIX
|
argument0 = 'String(' + argument0 + ')';
|
||||||
);
|
}
|
||||||
if (argument0 === "") {
|
return varName + ' += ' + argument0 + ';\n';
|
||||||
argument0 = '""';
|
|
||||||
} else {
|
|
||||||
argument0 = "String(" + argument0 + ")";
|
|
||||||
}
|
|
||||||
return varName + " += " + argument0 + ";\n";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,13 +76,10 @@ 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 =
|
var argument0 = Blockly.Arduino.valueToCode(block, 'VALUE',
|
||||||
Blockly.Arduino.valueToCode(
|
Blockly.Arduino.ORDER_UNARY_POSTFIX) || '""';
|
||||||
block,
|
var code = 'String(' + argument0 + ').length()';
|
||||||
"VALUE",
|
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
||||||
Blockly.Arduino.ORDER_UNARY_POSTFIX
|
|
||||||
) || '""';
|
|
||||||
var code = "String(" + argument0 + ").length()";
|
|
||||||
return [code, Blockly.Arduino.ORDER_UNARY_POSTFIX];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,15 +16,11 @@ 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 =
|
var delayTime = Blockly.Arduino.valueToCode(
|
||||||
Blockly.Arduino.valueToCode(
|
block, 'DELAY_TIME_MILI', Blockly.Arduino.ORDER_ATOMIC) || '0';
|
||||||
block,
|
var code = 'delay(' + delayTime + ');\n';
|
||||||
"DELAY_TIME_MILI",
|
return code;
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
) || "0";
|
|
||||||
var code = "delay(" + delayTime + ");\n";
|
|
||||||
return code;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,15 +29,11 @@ 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 =
|
var delayTimeMs = Blockly.Arduino.valueToCode(
|
||||||
Blockly.Arduino.valueToCode(
|
block, 'DELAY_TIME_MICRO', Blockly.Arduino.ORDER_ATOMIC) || '0';
|
||||||
block,
|
var code = 'delayMicroseconds(' + delayTimeMs + ');\n';
|
||||||
"DELAY_TIME_MICRO",
|
return code;
|
||||||
Blockly.Arduino.ORDER_ATOMIC
|
|
||||||
) || "0";
|
|
||||||
var code = "delayMicroseconds(" + delayTimeMs + ");\n";
|
|
||||||
return code;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,9 +42,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];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,9 +53,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];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,39 +64,17 @@ 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 intervalTime = this.getFieldValue("interval");
|
var interval = this.getFieldValue('interval');
|
||||||
var intervalName = this.getFieldValue("name");
|
Blockly.Arduino.variables_['define_interval_variables'] = 'const long interval = ' + interval + ';\nlong time_start = 0;\nlong time_actual = 0;';
|
||||||
Blockly.Arduino.variables_[`define_interval_variables${intervalName}`] = `
|
var branch = Blockly.Arduino.statementToCode(block, 'DO');
|
||||||
const long interval${intervalName} = ${intervalTime};
|
var code = 'time_start = millis();\n';
|
||||||
long time_start${intervalName} = 0;
|
code += 'if (time_start > time_actual + interval) {\n time_actual = millis();\n'
|
||||||
long time_actual${intervalName} = 0;`;
|
code += branch;
|
||||||
Blockly.Arduino.loopCodeOnce_[
|
code += '}\n'
|
||||||
`interval_loop${intervalName}`
|
return code;
|
||||||
] = `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;
|
|
||||||
};
|
};
|
||||||
@@ -1,60 +1,33 @@
|
|||||||
import Blockly from "blockly";
|
import Blockly from 'blockly';
|
||||||
|
|
||||||
const setVariableFunction = function (defaultValue) {
|
const setVariableFunction = function (defaultValue) {
|
||||||
return function (block) {
|
return function (block) {
|
||||||
const variableName = Blockly["Arduino"].nameDB_.getName(
|
const variableName = Blockly['Arduino'].variableDB_.getName(
|
||||||
block.getFieldValue("VAR"),
|
block.getFieldValue('VAR'),
|
||||||
Blockly.Variables.NAME_TYPE
|
Blockly.Variables.NAME_TYPE
|
||||||
);
|
);
|
||||||
const variableValue = Blockly["Arduino"].valueToCode(
|
const variableValue = Blockly['Arduino'].valueToCode(
|
||||||
block,
|
block,
|
||||||
"VALUE",
|
'VALUE',
|
||||||
Blockly["Arduino"].ORDER_ATOMIC
|
Blockly['Arduino'].ORDER_ATOMIC
|
||||||
);
|
);
|
||||||
|
|
||||||
const allVars = Blockly.getMainWorkspace()
|
const allVars = Blockly.getMainWorkspace().getVariableMap().getAllVariables();
|
||||||
.getVariableMap()
|
const myVar = allVars.filter(v => v.name === variableName)[0]
|
||||||
.getAllVariables();
|
|
||||||
const myVar = allVars.filter((v) => v.name === variableName)[0];
|
|
||||||
var code = "";
|
|
||||||
|
|
||||||
switch (myVar.type) {
|
Blockly.Arduino.variables_[myVar + myVar.type] = myVar.type + " " + myVar.name + ';\n';
|
||||||
default:
|
return variableName + ' = ' + (variableValue || defaultValue) + ';\n';
|
||||||
Blockly.Arduino.variables_[variableName + myVar.type] =
|
};
|
||||||
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;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const getVariableFunction = function (block) {
|
const getVariableFunction = function (block) {
|
||||||
const variableName = Blockly["Arduino"].nameDB_.getName(
|
const variableName = Blockly['Arduino'].variableDB_.getName(
|
||||||
block.getFieldValue("VAR"),
|
block.getFieldValue('VAR'),
|
||||||
Blockly.Variables.NAME_TYPE
|
Blockly.Variables.NAME_TYPE
|
||||||
);
|
);
|
||||||
var code = variableName;
|
|
||||||
return [code, Blockly["Arduino"].ORDER_ATOMIC];
|
return [variableName, Blockly['Arduino'].ORDER_ATOMIC];
|
||||||
};
|
};
|
||||||
|
|
||||||
Blockly["Arduino"]["variables_set_dynamic"] = setVariableFunction();
|
Blockly['Arduino']['variables_set_dynamic'] = setVariableFunction()
|
||||||
Blockly["Arduino"]["variables_get_dynamic"] = getVariableFunction;
|
Blockly['Arduino']['variables_get_dynamic'] = getVariableFunction;
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
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;
|
|
||||||
};
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
import Blockly from "blockly";
|
|
||||||
/**
|
|
||||||
* Webserver Blocks by Lucas Steinmann
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_initialize_http_server = function (block) {
|
|
||||||
var box_id = this.getFieldValue("Port");
|
|
||||||
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
|
|
||||||
Blockly.Arduino.libraries_["library_http"] = "#include <WebUtil.h>";
|
|
||||||
|
|
||||||
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) {
|
|
||||||
var onConnect = Blockly.Arduino.statementToCode(block, "ON_CONNECT");
|
|
||||||
var code = "";
|
|
||||||
code += "WiFiClient client = server.available();\n";
|
|
||||||
code += "if (client && client.available()) {\n";
|
|
||||||
code += " String request_string = listenClient(client);\n";
|
|
||||||
code += " Request request;\n";
|
|
||||||
code += " if (parseRequestSafe(request_string, request)) {\n";
|
|
||||||
code += onConnect;
|
|
||||||
code += " }\n";
|
|
||||||
code += " delay(1);\n";
|
|
||||||
code += " client.stop();\n";
|
|
||||||
code += " delay(1);\n";
|
|
||||||
code += "}\n";
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_http_method = function (block) {
|
|
||||||
var code = "request.method";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_http_uri = function (block) {
|
|
||||||
var code = "request.uri";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_http_protocol_version = function (block) {
|
|
||||||
var code = "request.protocol_version";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_http_user_agent = function (block) {
|
|
||||||
var code = "request.user_agent";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_generate_html_doc = function (block) {
|
|
||||||
var header =
|
|
||||||
Blockly.Arduino.valueToCode(block, "HEADER", Blockly.Arduino.ORDER_NONE) ||
|
|
||||||
'""';
|
|
||||||
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) {
|
|
||||||
var content =
|
|
||||||
Blockly.Arduino.valueToCode(block, "CONTENT", Blockly.Arduino.ORDER_NONE) ||
|
|
||||||
'""';
|
|
||||||
var code =
|
|
||||||
"client.println(buildSuccessfulResponse(request, " + content + "));\n";
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) {
|
|
||||||
var code = "client.println(buildNotFoundResponse(request));\n";
|
|
||||||
return code;
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_ip_address = function (block) {
|
|
||||||
var code = "b->getIpAddress()";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||
|
|
||||||
Blockly.Arduino.sensebox_general_html_tag = function (block) {
|
|
||||||
var tag = this.getFieldValue("TAG");
|
|
||||||
var code = 'buildTag("' + tag + '",';
|
|
||||||
var n = 0;
|
|
||||||
var branch = Blockly.Arduino.valueToCode(
|
|
||||||
block,
|
|
||||||
"DO" + n,
|
|
||||||
Blockly.Arduino.ORDER_NONE
|
|
||||||
);
|
|
||||||
if (branch.length > 0) {
|
|
||||||
code += "\n " + branch;
|
|
||||||
} else {
|
|
||||||
code += '""';
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
var filename = this.getFieldValue("FILENAME");
|
|
||||||
Blockly.Arduino.libraries_["library_spi"] = "#include <SPI.h>";
|
|
||||||
Blockly.Arduino.libraries_["library_sd"] = "#include <SD.h>";
|
|
||||||
Blockly.Arduino.codeFunctions_["define_sd" + filename] = "File webFile;";
|
|
||||||
Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);";
|
|
||||||
var func = [
|
|
||||||
"String generateHTML(){",
|
|
||||||
' webFile = SD.open("' + filename + '", FILE_READ);',
|
|
||||||
' String finalString ="";',
|
|
||||||
" while (webFile.available())",
|
|
||||||
" {",
|
|
||||||
" finalString+=(char)webFile.read();",
|
|
||||||
" }",
|
|
||||||
" return finalString;",
|
|
||||||
"}",
|
|
||||||
];
|
|
||||||
var functionName = Blockly.Arduino.addFunction(
|
|
||||||
"generateHTML",
|
|
||||||
func.join("\n")
|
|
||||||
);
|
|
||||||
var code = functionName + "()";
|
|
||||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
|
||||||
};
|
|
||||||