Compare commits

..

2 Commits

Author SHA1 Message Date
Mario Pesch
8c4dbadf16
Merge branch 'development' into dev/add-more-board-features 2023-01-06 13:24:42 +01:00
Mario Pesch
53ee280acc add board to share projects 2023-01-06 13:09:59 +01:00
58 changed files with 415 additions and 1180 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,18 +3,18 @@
"version": "1.0.0", "version": "1.0.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@blockly/block-plus-minus": "^4.0.4", "@blockly/block-plus-minus": "^3.0.5",
"@blockly/field-grid-dropdown": "^2.0.4", "@blockly/field-grid-dropdown": "^1.0.31",
"@blockly/field-slider": "4.0.4", "@blockly/field-slider": "^3.0.5",
"@blockly/plugin-scroll-options": "^3.0.5", "@blockly/plugin-scroll-options": "^2.0.5",
"@blockly/plugin-typed-variable-modal": "^5.0.6", "@blockly/plugin-typed-variable-modal": "^4.0.5",
"@blockly/workspace-backpack": "^3.0.4", "@blockly/workspace-backpack": "^2.0.12",
"@blockly/zoom-to-fit": "^3.0.4", "@blockly/zoom-to-fit": "^2.0.14",
"@emotion/react": "^11.10.5", "@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5", "@emotion/styled": "^11.10.5",
"@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/fontawesome-svg-core": "^1.2.36",
"@fortawesome/free-solid-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^5.15.4",
"@fortawesome/react-fontawesome": "^0.2.0", "@fortawesome/react-fontawesome": "^0.1.19",
"@monaco-editor/react": "^4.3.1", "@monaco-editor/react": "^4.3.1",
"@mui/lab": "^5.0.0-alpha.110", "@mui/lab": "^5.0.0-alpha.110",
"@mui/material": "^5.10.16", "@mui/material": "^5.10.16",
@ -23,7 +23,7 @@
"@testing-library/react": "^12.1.2", "@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^7.2.1", "@testing-library/user-event": "^7.2.1",
"axios": "^0.22.0", "axios": "^0.22.0",
"blockly": "^9.2.0", "blockly": "^8.0.3",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"markdown-it": "^12.3.2", "markdown-it": "^12.3.2",
"mnemonic-id": "^3.2.7", "mnemonic-id": "^3.2.7",
@ -70,8 +70,5 @@
">0.2%", ">0.2%",
"not dead", "not dead",
"not op_mini all" "not op_mini all"
], ]
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "7.21.11"
}
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 777 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 728 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

View File

@ -0,0 +1,150 @@
import { GET_ARDUINO_EXAMPLES } from './types';
import axios from 'axios';
import { returnErrors, returnSuccess } from './messageActions';
export const getArduinoExamples = () => (dispatch) => {
const config = {
success: res => {
var examples = res.data.arduinoExamples;
console.log(examples);
dispatch({
type: GET_ARDUINO_EXAMPLES,
payload: examples
});
dispatch(returnSuccess(res.data.message, res.status));
},
error: err => {
if (err.response) {
dispatch(returnErrors(err.response.data.message, err.response.status, 'GET_PROJECTS_FAIL'));
}
}
};
axios.get(`${process.env.REACT_APP_BLOCKLY_API}/arduino`, 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,
// board: getState().board.board,
// };
// 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,
// board: getState().board.board
// };
// 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(''));
// };

View File

@ -90,7 +90,8 @@ export const updateProject = (type, id) => (dispatch, getState) => {
var workspace = getState().workspace; var workspace = getState().workspace;
var body = { var body = {
xml: workspace.code.xml, xml: workspace.code.xml,
title: workspace.name title: workspace.name,
board: getState().board.board,
}; };
var project = getState().project; var project = getState().project;
if (type === 'gallery') { if (type === 'gallery') {
@ -165,7 +166,8 @@ export const deleteProject = (type, id) => (dispatch, getState) => {
export const shareProject = (title, type, id) => (dispatch, getState) => { export const shareProject = (title, type, id) => (dispatch, getState) => {
var body = { var body = {
title: title title: title,
board: getState().board.board
}; };
if (type === 'project') { if (type === 'project') {
body.projectId = id; body.projectId = id;

View File

@ -64,5 +64,7 @@ export const GET_PROJECTS = "GET_PROJECTS";
export const PROJECT_TYPE = "PROJECT_TYPE"; export const PROJECT_TYPE = "PROJECT_TYPE";
export const PROJECT_DESCRIPTION = "PROJECT_DESCRIPTION"; export const PROJECT_DESCRIPTION = "PROJECT_DESCRIPTION";
export const GET_ARDUINO_EXAMPLES = "GET_ARDUINO_EXAMPLES";
//board //board
export const BOARD = "BOARD"; export const BOARD = "BOARD";

View File

@ -16,7 +16,7 @@ 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.getSelected(); var selectedBlock = Blockly.selected
if (selectedBlock !== null) { if (selectedBlock !== null) {
code.helpurl = selectedBlock.helpUrl code.helpurl = selectedBlock.helpUrl
code.tooltip = selectedBlock.tooltip code.tooltip = selectedBlock.tooltip

View File

@ -45,7 +45,6 @@ class BlocklyWindow extends Component {
const workspace = Blockly.getMainWorkspace(); const workspace = Blockly.getMainWorkspace();
var xml = this.props.initialXml; var xml = this.props.initialXml;
if (props.selectedBoard !== this.props.selectedBoard) { if (props.selectedBoard !== this.props.selectedBoard) {
xml = localStorage.getItem("autoSaveXML");
// change board // change board
if(!xml) xml = initialXml; if(!xml) xml = initialXml;
var xmlDom = Blockly.Xml.textToDom(xml); var xmlDom = Blockly.Xml.textToDom(xml);
@ -63,7 +62,6 @@ class BlocklyWindow extends Component {
} }
if (props.language !== this.props.language) { if (props.language !== this.props.language) {
// change language // change language
xml = localStorage.getItem("autoSaveXML");
if (!xml) xml = initialXml; if (!xml) xml = initialXml;
xmlDom = Blockly.Xml.textToDom(xml); xmlDom = Blockly.Xml.textToDom(xml);
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace); Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);

View File

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

View File

@ -10,7 +10,6 @@ import "./sensebox-motors";
import "./sensebox-lora"; import "./sensebox-lora";
import "./sensebox-led"; import "./sensebox-led";
import "./sensebox-rtc"; import "./sensebox-rtc";
import "./sensebox-ntp";
import "./sensebox-ble"; import "./sensebox-ble";
import "./sensebox-sd"; import "./sensebox-sd";
import "./mqtt"; import "./mqtt";
@ -26,6 +25,5 @@ import "./variables";
import "./lists"; import "./lists";
import "./watchdog"; import "./watchdog";
import "./webserver"; import "./webserver";
import "./CleVerLab"
import "../helpers/types"; import "../helpers/types";

View File

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

View File

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

View File

@ -118,7 +118,7 @@ Blockly.Blocks["sensebox_sensor_sds011"] = {
.appendField(Blockly.Msg.senseBox_sds011_dimension) .appendField(Blockly.Msg.senseBox_sds011_dimension)
.appendField( .appendField(
new Blockly.FieldDropdown( new Blockly.FieldDropdown(
selectedBoard().serialSensors), selectedBoard().serial),
"SERIAL" "SERIAL"
); );
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
@ -191,7 +191,7 @@ Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
var dropdownOptions = [ var dropdownOptions = [
[Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_temp, "temperature"],
[Blockly.Msg.senseBox_hum, "humidity"], [Blockly.Msg.senseBox_hum, "humidity"],
[Blockly.Msg.senseBox_bme_pressure, "pressure"], [Blockly.Msg.senseBox_pressure, "pressure"],
[Blockly.Msg.senseBox_bme_iaq, "IAQ"], [Blockly.Msg.senseBox_bme_iaq, "IAQ"],
[Blockly.Msg.senseBox_bme_iaq_accuracy, "IAQAccuracy"], [Blockly.Msg.senseBox_bme_iaq_accuracy, "IAQAccuracy"],
[Blockly.Msg.senseBox_bme_co2, "CO2"], [Blockly.Msg.senseBox_bme_co2, "CO2"],
@ -218,7 +218,12 @@ Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = { Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = {
init: function () { init: function () {
var dropdown = new FieldGridDropdown(selectedBoard().digitalPorts, function (option) { var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
var dropdown = new FieldGridDropdown(dropdownOptions, function (option) {
var input = option === "A" || option === "B" || option === "C"; var input = option === "A" || option === "B" || option === "C";
this.sourceBlock_.updateShape_(input); this.sourceBlock_.updateShape_(input);
}); });
@ -331,7 +336,6 @@ Blockly.Blocks["sensebox_button"] = {
[Blockly.Msg.senseBox_button_isPressed, "isPressed"], [Blockly.Msg.senseBox_button_isPressed, "isPressed"],
[Blockly.Msg.senseBox_button_wasPressed, "wasPressed"], [Blockly.Msg.senseBox_button_wasPressed, "wasPressed"],
[Blockly.Msg.senseBox_button_longPress, "longPress"], [Blockly.Msg.senseBox_button_longPress, "longPress"],
[Blockly.Msg.senseBox_button_switch,"toggleButton"]
]), ]),
"FUNCTION" "FUNCTION"
) )
@ -430,11 +434,16 @@ Blockly.Blocks["sensebox_gps"] = {
Blockly.Blocks["sensebox_sensor_truebner_smt50"] = { Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
init: function () { init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(Blockly.Msg.senseBox_smt50); this.appendDummyInput().appendField(Blockly.Msg.senseBox_smt50);
this.appendDummyInput() this.appendDummyInput()
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port"); .appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField( .appendField(
@ -458,12 +467,16 @@ Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
Blockly.Blocks["sensebox_sensor_watertemperature"] = { Blockly.Blocks["sensebox_sensor_watertemperature"] = {
init: function () { init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_watertemperature) .appendField(Blockly.Msg.senseBox_watertemperature)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port"); .appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip); this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip);
this.data = {name: "ds18b20"}; this.data = {name: "ds18b20"};
@ -493,11 +506,16 @@ Blockly.Blocks['sensebox_windspeed'] = {
Blockly.Blocks["sensebox_soundsensor_dfrobot"] = { Blockly.Blocks["sensebox_soundsensor_dfrobot"] = {
init: function () { init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_soundsensor_dfrobot) .appendField(Blockly.Msg.senseBox_soundsensor_dfrobot)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port"); .appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip); this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl);
@ -555,31 +573,3 @@ Blockly.Blocks["sensebox_sensor_dps310"] = {
} }
}, },
}; };
/**
* Sensirion SPS30 Fine Particular Matter Sensor
* added 02.12.2022
*/
Blockly.Blocks["sensebox_sensor_sps30"] = {
init: function () {
this.appendDummyInput().appendField(Blockly.Msg.senseBox_sps30);
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_value)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_sps30_1p0, "1p0"],
[Blockly.Msg.senseBox_sps30_2p5, "2p5"],
[Blockly.Msg.senseBox_sps30_4p0, "4p0"],
[Blockly.Msg.senseBox_sps30_10p0, "10p0"],
]),
"value"
)
.appendField(Blockly.Msg.senseBox_sps30_dimension);
this.setOutput(true, Types.DECIMAL.typeName);
this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sps30_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_sps30_helpurl);
},
};

View File

@ -10,7 +10,7 @@ Blockly.Blocks["variables_set_dynamic"] = {
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.appendValueInput("VALUE") this.appendValueInput("VALUE")
.appendField(Blockly.Msg.variables_set, Blockly.Msg.variables_set) .appendField(Blockly.Msg.variables_set, Blockly.Msg.variables_set)
.appendField("", "type") // .appendField("", "type")
.appendField(new Blockly.FieldVariable("VAR"), "VAR") .appendField(new Blockly.FieldVariable("VAR"), "VAR")
.appendField(Blockly.Msg.variables_to); .appendField(Blockly.Msg.variables_to);
}, },

View File

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

View File

@ -10,7 +10,6 @@ import "./sensebox-lora";
import "./sensebox-led"; import "./sensebox-led";
import "./sensebox"; import "./sensebox";
import "./sensebox-rtc"; import "./sensebox-rtc";
import "./sensebox-ntp";
import "./sensebox-ble"; import "./sensebox-ble";
import "./sensebox-sd"; import "./sensebox-sd";
import "./mqtt"; import "./mqtt";
@ -27,4 +26,3 @@ import "./variables";
import "./lists"; import "./lists";
import "./watchdog"; import "./watchdog";
import "./webserver"; import "./webserver";
import "./CleVerLab"

View File

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

View File

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

View File

@ -94,46 +94,3 @@ uint8_t sec, min, hour, day, month;
var code = `getTimeStamp()`; var code = `getTimeStamp()`;
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
Blockly.Arduino.sensebox_internal_rtc_init = function () {
Blockly.Arduino.libraries_["RTClib"] = `#include <RTCZero.h>`;
Blockly.Arduino.definitions_["RTC"] = `RTCZero rtc;`;
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.setupCode_["rtc.begin"] = `rtc.begin();`;
return "";
};
Blockly.Arduino.sensebox_internal_rtc_set = function () {
var branch =
Blockly.Arduino.valueToCode(this, "time", Blockly.Arduino.ORDER_ATOMIC) ||
"0";
Blockly.Arduino.setupCode_["rtc.setEpoch"] = `rtc.setEpoch(${branch});`;
var code = ``;
return code;
};
Blockly.Arduino.sensebox_internal_rtc_get = function () {
var dropdown = this.getFieldValue("dropdown");
var code = `rtc.get${dropdown}()`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.sensebox_internal_rtc_get_timestamp = function () {
Blockly.Arduino.variables_["rtc_timestamp"] = `char timestamp[20];`;
Blockly.Arduino.codeFunctions_["getTimeStamp"] = `
char* getTimeStamp() {
uint8_t sec, min, hour, day, month;
uint16_t year;
sec = rtc.getSeconds();
min = rtc.getMinutes();
hour = rtc.getHours();
day = rtc.getDay();
month = rtc.getMonth();
year = rtc.getYear();
sprintf(timestamp, "%02d-%02d-%02dT%02d:%02d:%02dZ", year, month, day, hour, min, sec);
return timestamp;
}
`;
var code = `getTimeStamp()`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -399,7 +399,6 @@ Blockly.Arduino.sensebox_button = function () {
Blockly.Arduino.libraries_[ Blockly.Arduino.libraries_[
"library_jcButtons" "library_jcButtons"
] = `#include <JC_Button.h> // http://librarymanager/All#JC_Button`; ] = `#include <JC_Button.h> // http://librarymanager/All#JC_Button`;
Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] = Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
"Button button_" + dropdown_pin + "(" + dropdown_pin + ");"; "Button button_" + dropdown_pin + "(" + dropdown_pin + ");";
Blockly.Arduino.setupCode_["setup_button" + dropdown_pin + ""] = Blockly.Arduino.setupCode_["setup_button" + dropdown_pin + ""] =
@ -414,10 +413,6 @@ Blockly.Arduino.sensebox_button = function () {
} else if (dropown_function === "longPress") { } else if (dropown_function === "longPress") {
var time = this.getFieldValue("time"); var time = this.getFieldValue("time");
code = "button_" + dropdown_pin + ".pressedFor(" + time + ")"; code = "button_" + dropdown_pin + ".pressedFor(" + time + ")";
} else if (dropown_function === "toggleButton") {
code = "button_" + dropdown_pin + ".toggleState()";
Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
"ToggleButton button_" + dropdown_pin + "(" + dropdown_pin + ");";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
@ -434,13 +429,11 @@ Blockly.Arduino.sensebox_scd30 = function () {
"#include <SparkFun_SCD30_Arduino_Library.h> // http://librarymanager/All#SparkFun_SCD30_Arduino_Library"; "#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.setupCode_["init_scd30"] = ` Wire.begin(); Blockly.Arduino.setupCode_["init_scd30"] = ` Wire.begin();
if (airSensor.begin() == false) if (airSensor.begin() == false)
{ {
while (1) while (1)
; ;
}`; }`;
Blockly.Arduino.setupCode_["scd30_staleData"] =
"airSensor.useStaleData(true);";
var code = ""; var code = "";
switch (dropdown) { switch (dropdown) {
case "temperature": case "temperature":
@ -699,57 +692,3 @@ Blockly.Arduino.sensebox_sensor_dps310 = function () {
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };
/**
* Sensirion SPS30 Fine Particlar Matter
*
*/
Blockly.Arduino.sensebox_sensor_sps30 = function () {
var dropdown_name = this.getFieldValue("value");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_[
"sps30"
] = `#include <sps30.h> // http://librarymanager/All#`;
Blockly.Arduino.variables_["sps30_measurement"] =
"struct sps30_measurement m;";
Blockly.Arduino.variables_["sps30_auto_clean_days"] =
"uint32_t auto_clean_days = 4;";
Blockly.Arduino.variables_["sps30_interval_intervalsps"] =
"const long intervalsps = 1000;";
Blockly.Arduino.variables_["sps30_time_startsps"] =
"unsigned long time_startsps = 0;";
Blockly.Arduino.variables_["sps30_time_actualsps"] =
"unsigned long time_actualsps = 0;";
Blockly.Arduino.codeFunctions_["sps30_getData"] = `
void getSPS30Data(){
uint16_t data_ready;
int16_t ret;
do {
ret = sps30_read_data_ready(&data_ready);
if (ret < 0) {
} else if (!data_ready) {}
else
break;
delay(100); /* retry in 100ms */
} while (1);
ret = sps30_read_measurement(&m);
}
`;
Blockly.Arduino.setupCode_["sps30_begin"] = "sensirion_i2c_init();";
Blockly.Arduino.setupCode_["sps30_setFanCleaningInterval"] =
"sps30_set_fan_auto_cleaning_interval_days(auto_clean_days);";
Blockly.Arduino.setupCode_["sps30_startMeasurement"] =
"sps30_start_measurement();";
Blockly.Arduino.loopCodeOnce_["getSPS30Data();"] = `
time_startsps = millis();
if (time_startsps > time_actualsps + intervalsps) {
time_actualsps = millis();
getSPS30Data();
}`;
var code = `m.mc_${dropdown_name}`;
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -13,11 +13,6 @@ const sensebox_mcu = {
["C5", "5"], ["C5", "5"],
["C6", "6"], ["C6", "6"],
], ],
digitalPorts: [
["A", "A"],
["B", "B"],
["C", "C"],
],
digitalPinsLED: [ digitalPinsLED: [
["BUILTIN_1", "7"], ["BUILTIN_1", "7"],
["BUILTIN_2", "8"], ["BUILTIN_2", "8"],
@ -51,13 +46,9 @@ const sensebox_mcu = {
["C6", "6"], ["C6", "6"],
], ],
serial: [ serial: [
["SerialUSB", "SerialUSB"], ["serial", "SerialUSB"],
["Serial1", "Serial1"], ["serial_1", "Serial1"],
["Serial2", "Serial2"], ["serial_2", "Serial2"],
],
serialSensors: [
["Serial1", "Serial1"],
["Serial2", "Serial2"],
], ],
serialPins: { serialPins: {
SerialUSB: [ SerialUSB: [
@ -148,9 +139,6 @@ const sensebox_mini = {
["IO1", "1"], ["IO1", "1"],
["IO2", "2"], ["IO2", "2"],
], ],
digitalPorts: [
["IO1-2", "A"],
],
digitalPinsLED: [ digitalPinsLED: [
["BUILTIN_1", "7"], ["BUILTIN_1", "7"],
["BUILTIN_2", "8"], ["BUILTIN_2", "8"],
@ -159,7 +147,8 @@ const sensebox_mini = {
], ],
digitalPinsRGB: [ digitalPinsRGB: [
["on Board", "6"], ["on Board", "6"],
["IO1-2", "1"], ["IO1", "1"],
["IO2", "2"],
], ],
digitalPinsButton: [ digitalPinsButton: [
["on Board", "0"], ["on Board", "0"],
@ -172,11 +161,8 @@ const sensebox_mini = {
["IO2", "2"], ["IO2", "2"],
], ],
serial: [ serial: [
["SerialUSB", "SerialUSB"], ["serial", "SerialUSB"],
["Serial1", "Serial1"], ["serial_1", "Serial1"],
],
serialSensors: [
["Serial1", "Serial1"],
], ],
serialPins: { serialPins: {
SerialUSB: [ SerialUSB: [

View File

@ -15,7 +15,6 @@ const colours = {
webserver: 40, webserver: 40,
phyphox: 25, phyphox: 25,
motors: 190, motors: 190,
cleverlab: 185 ,
}; };
export const getColour = () => { export const getColour = () => {

View File

@ -13,8 +13,6 @@ const maxInstances = {
sensebox_lora_initialize_otaa: 1, sensebox_lora_initialize_otaa: 1,
sensebox_lora_initialize_abp: 1, sensebox_lora_initialize_abp: 1,
sensebox_phyphox_init: 1, sensebox_phyphox_init: 1,
sensebox_phyphox_experiment: 1,
sensebox_phyphox_experiment_send: 1,
sensebox_ethernet: 1, sensebox_ethernet: 1,
}; };

View File

@ -21,8 +21,8 @@
* @author samelh@google.com (Sam El-Husseini) * @author samelh@google.com (Sam El-Husseini)
*/ */
import React from "react"; import React from 'react';
import BlocklyComponent from "./BlocklyComponent"; import BlocklyComponent from './BlocklyComponent';
export default BlocklyComponent; export default BlocklyComponent;
@ -56,16 +56,4 @@ const Shadow = (p) => {
return React.createElement("shadow", props, children); return React.createElement("shadow", props, children);
}; };
const Sep = (p) => { export { Block, Category, Value, Field, Shadow }
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("sep", props, children);
};
const Label = (p) => {
const { children, ...props } = p;
props.is = "blockly";
return React.createElement("label", props, children);
};
export { Block, Category, Value, Field, Shadow, Sep, Label };

View File

@ -12,7 +12,6 @@ import { LED } from "./de/sensebox-led";
import { LORA } from "./de/sensebox-lora"; import { LORA } from "./de/sensebox-lora";
import { OSEM } from "./de/sensebox-osem"; import { OSEM } from "./de/sensebox-osem";
import { RTC } from "./de/sensebox-rtc"; import { RTC } from "./de/sensebox-rtc";
import { NTP } from "./de/sensebox-ntp";
import { SD } from "./de/sensebox-sd"; import { SD } from "./de/sensebox-sd";
import { SENSORS } from "./de/sensebox-sensors"; import { SENSORS } from "./de/sensebox-sensors";
import { SENSEBOX } from "./de/sensebox"; import { SENSEBOX } from "./de/sensebox";
@ -41,7 +40,6 @@ export const De = {
...LORA, ...LORA,
...OSEM, ...OSEM,
...RTC, ...RTC,
...NTP,
...SD, ...SD,
...SENSORS, ...SENSORS,
...SENSEBOX, ...SENSEBOX,

View File

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

View File

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

View File

@ -140,7 +140,6 @@ Wenn die maximale Distanz überschritten wird, wird ein Wert von **O** ausgegebe
senseBox_bme_iaq: "Innenraumluftqualität (IAQ)", senseBox_bme_iaq: "Innenraumluftqualität (IAQ)",
senseBox_bme_iaq_accuracy: "Kalibrierungswert", senseBox_bme_iaq_accuracy: "Kalibrierungswert",
senseBox_bme_co2: "CO2 Äquivalent", senseBox_bme_co2: "CO2 Äquivalent",
senseBox_bme_pressure: "Luftdruck in Pa",
senseBox_bme_breatheVocEquivalent: "Atemluft VOC Äquivalent", senseBox_bme_breatheVocEquivalent: "Atemluft VOC Äquivalent",
senseBox_bme_tooltip: `Schließe den Umweltsensor an einen der 5 **I2C-Anschlüsse** an. **Beachte:** Der Sensor benöigt eine gewisse Zeit zum kalibrieren. senseBox_bme_tooltip: `Schließe den Umweltsensor an einen der 5 **I2C-Anschlüsse** an. **Beachte:** Der Sensor benöigt eine gewisse Zeit zum kalibrieren.
Den Status der Kalibrierung kann über den Kalibrierungswert abgelesen werden. Er ist entweder 0, 1, 2 oder 3 und sagt folgendes aus: Den Status der Kalibrierung kann über den Kalibrierungswert abgelesen werden. Er ist entweder 0, 1, 2 oder 3 und sagt folgendes aus:
@ -176,7 +175,7 @@ Die Messwerte für Temperatur, Luftfeuchtigkeit und Luftdruck können direkt ver
* Feinstaubsensor (SDS011) * Feinstaubsensor (SDS011)
*/ */
senseBox_sds011: "Feinstaubsensor SDS011", senseBox_sds011: "Feinstaubsensor",
senseBox_sds011_dimension: "in µg/m³ an", senseBox_sds011_dimension: "in µg/m³ an",
senseBox_sds011_pm25: "PM2.5", senseBox_sds011_pm25: "PM2.5",
senseBox_sds011_pm10: "PM10", senseBox_sds011_pm10: "PM10",
@ -201,23 +200,4 @@ Die Messwerte für Temperatur, Luftfeuchtigkeit und Luftdruck können direkt ver
- "wurde gedrückt": Mit diesem Modus kannst du abfragen ob der Block gedrückt wurde. Erst wenn der Knopf gedrückt und wieder losgelassen wurde erhältst du TRUE zurück - "wurde gedrückt": Mit diesem Modus kannst du abfragen ob der Block gedrückt wurde. Erst wenn der Knopf gedrückt und wieder losgelassen wurde erhältst du TRUE zurück
- "als Schalter": Wenn du diesen Block verwendest kannst du den Knopf wie ein Lichtschalter verwenden. Der Status wird gespeichert bis der Button erneut gedrückt wird`, - "als Schalter": Wenn du diesen Block verwendest kannst du den Knopf wie ein Lichtschalter verwenden. Der Status wird gespeichert bis der Button erneut gedrückt wird`,
senseBox_button_helpurl: "", senseBox_button_helpurl: "",
};
/**
* Feinstaubsensor Sensirion SPS30
*/
senseBox_sps30: "Feinstaubsensor Sensirion SPS30",
senseBox_sps30_dimension: "in µg/m³",
senseBox_sps30_1p0: "PM1.0",
senseBox_sps30_2p5: "PM2.5",
senseBox_sps30_4p0: "PM4.0",
senseBox_sps30_10p0: "PM10",
senseBox_sps30_tooltip:"Dieser Block gibt dir den Messwert des Sensirion SPS30 Feinstaubsensor. Schließe den Feinstaubsensor an einen der 5 **I2C** Anschlüssen an. Im Dropdown Menü zwischen PM1.0, PM2.5, PM4.0 und PM10 auswählen. Der Messwert wird dir als **Kommazahl** in µg/m3",
senseBox_sps30_helpurl:
"https://docs.sensebox.de/hardware/sensoren-feinstaub/",
};

View File

@ -8,15 +8,11 @@ export const UI = {
toolbox_math: "Mathematik", toolbox_math: "Mathematik",
toolbox_io: "Eingang/Ausgang", toolbox_io: "Eingang/Ausgang",
toolbox_time: "Zeit", toolbox_time: "Zeit",
toolbox_rtc: "RTC",
toolbox_ntp: "NTP",
toolbox_functions: "Funktionen", toolbox_functions: "Funktionen",
toolbox_variables: "Variablen", toolbox_variables: "Variablen",
toolbox_serial: "Seriell", toolbox_serial: "Seriell",
toolbox_advanced: "Erweitert", toolbox_advanced: "Erweitert",
toolbox_motors: "Motoren", toolbox_motors: "Motoren",
toolbox_label_externalRTC: "Externe RTC",
toolbox_label_internalRTC: "Interne RTC",
variable_NUMBER: "Zahl (int)", variable_NUMBER: "Zahl (int)",
variable_SHORT_NUMBER: "char", variable_SHORT_NUMBER: "char",
variable_LONG: "große Zahl (long)", variable_LONG: "große Zahl (long)",
@ -316,8 +312,7 @@ export const UI = {
* Device Selction * Device Selction
* */ * */
deviceselection_head: "Welches Board benutzt du?", deviceselection_head: "Welches Board benutzt du?",
deviceselection_keep_selection: deviceselection_keep_selection: "Speichere meine Auswahl fürs nächste Mal (Du kannst das Board später in den Einstellungen wechseln)",
"Speichere meine Auswahl fürs nächste Mal (Du kannst das Board später in den Einstellungen wechseln)",
deviceselection_footnote: "Hier kommst du zur alten Blockly Version für den ", deviceselection_footnote: "Hier kommst du zur alten Blockly Version für den ",
deviceselection_footnote_02: "oder die", deviceselection_footnote_02: "oder die",

View File

@ -13,7 +13,6 @@ import { LED } from "./en/sensebox-led";
import { LORA } from "./en/sensebox-lora"; import { LORA } from "./en/sensebox-lora";
import { OSEM } from "./en/sensebox-osem"; import { OSEM } from "./en/sensebox-osem";
import { RTC } from "./en/sensebox-rtc"; import { RTC } from "./en/sensebox-rtc";
import { NTP } from "./en/sensebox-ntp";
import { SD } from "./en/sensebox-sd"; import { SD } from "./en/sensebox-sd";
import { SENSORS } from "./en/sensebox-sensors"; import { SENSORS } from "./en/sensebox-sensors";
import { TELEGRAM } from "./en/sensebox-telegram"; import { TELEGRAM } from "./en/sensebox-telegram";
@ -41,7 +40,6 @@ export const En = {
...LORA, ...LORA,
...OSEM, ...OSEM,
...RTC, ...RTC,
...NTP,
...SD, ...SD,
...SENSORS, ...SENSORS,
...SENSEBOX, ...SENSEBOX,

View File

@ -1,3 +0,0 @@
export const CLEVERLAB = {
}

View File

@ -1,10 +0,0 @@
export const NTP = {
sensebox_ntp_init: "Initialise NTP",
sensebox_ntp_init_tooltip:
"Initialisiere die RTC. Schließe diese an einen der 5 I2C/Wire Anschlüsse an und lege die Batterie ein. Bevor du die Uhrzeit auslesen kannst muss diese zunächst einmal gesetzt werden. Dieser Schritt muss normalerweise nur einmalig durchgeführt werden.",
sensebox_ntp_get: "Get time from NTP Server: ",
sensebox_ntp_get_tooltip:
"Gibt dir den ausgewählten Wert zurück. Unix Zeit entspricht der Anzahl der Sekunden seit dem 1.1.1970",
sensebox_ntp_epochTime: "Unix time",
sensebox_ntp_formattedTimeStamp: "Timestamp (hh:mm:ss)",
};

View File

@ -1,11 +1,11 @@
export const RTC = { export const RTC = {
sensebox_rtc_init: "Initialise external RTC", sensebox_rtc_init: "Initialise RTC",
sensebox_rtc_init_tooltip: sensebox_rtc_init_tooltip:
"Initialise the RTC. Connect it to one of the 5 I2C/Wire connections and insert the battery. Before you can read out the time, it must first be set. This step usually only needs to be done once.", "Initialise the RTC. Connect it to one of the 5 I2C/Wire connections and insert the battery. Before you can read out the time, it must first be set. This step usually only needs to be done once.",
sensebox_rtc_set: "Set RTC time/date:", sensebox_rtc_set: "Set RTC time/date:",
sensebox_rtc_set_tooltip: sensebox_rtc_set_tooltip:
"Sets the time of the RTC. Note that you execute this block in the setup.", "Sets the time of the RTC. Note that you execute this block in the setup.",
sensebox_rtc_get_timestamp: "Timestamp external RTC (RFC 3339)", sensebox_rtc_get_timestamp: "Get timestamp",
sensebox_rtc_get_timestamp_tooltip: sensebox_rtc_get_timestamp_tooltip:
"Returns a timestamp formatted in ISO 8601. Ex: 2021-12-24T18:21Z", "Returns a timestamp formatted in ISO 8601. Ex: 2021-12-24T18:21Z",
sensebox_rtc_get_tooltip: "Returns the selected value", sensebox_rtc_get_tooltip: "Returns the selected value",
@ -17,22 +17,4 @@ export const RTC = {
sensebox_rtc_day: "day", sensebox_rtc_day: "day",
sensebox_rtc_month: "month", sensebox_rtc_month: "month",
sensebox_rtc_year: "year", sensebox_rtc_year: "year",
sensebox_internal_rtc_init: "Initialise internal RTC",
sensebox_internal_rtc_init_tooltip:
"Initialise the internal RTC. This RTC is not battery backed and will be reset on every power cycle.",
sensebox_internal_rtc_set: "Set internal RTC time/date:",
sensebox_internal_rtc_set_tooltip:
"Sets the time of the internal RTC. Note that you execute this block in the setup.",
sensebox_internal_rtc_get: "Get: ",
sensebox_internal_rtc_get_timestamp: "Timestamp internal RTC (RFC 3339)",
sensebox_internal_rtc_get_timestamp_tooltip:
"Returns a timestamp formatted in ISO 8601. Ex: 2021-12-24T18:21Z",
sensebox_internal_rtc_get_tooltip: "Returns the selected value",
sensebox_internal_rtc_epoch: "Unix Time",
sensebox_internal_rtc_year: "year",
sensebox_internal_rtc_month: "month",
sensebox_internal_rtc_day: "day",
sensebox_internal_rtc_hour: "hour",
sensebox_internal_rtc_minutes: "minutes",
sensebox_internal_rtc_seconds: "seconds",
}; };

View File

@ -141,7 +141,6 @@ If the max distance is reached the a value of **O** will be returned`,
senseBox_bme680: "Environmental sensor (BME680)", senseBox_bme680: "Environmental sensor (BME680)",
senseBox_bme_iaq: "Indoor Air Quality (IAQ)", senseBox_bme_iaq: "Indoor Air Quality (IAQ)",
senseBox_bme_iaq_accuracy: "Calibration Value", senseBox_bme_iaq_accuracy: "Calibration Value",
senseBox_bme_pressure: "Airpressure in Pa",
senseBox_bme_co2: "CO2 Equivalent", senseBox_bme_co2: "CO2 Equivalent",
senseBox_bme_breatheVocEquivalent: "Breathe VOC Equivalent", senseBox_bme_breatheVocEquivalent: "Breathe VOC Equivalent",
senseBox_bme_tooltip: `Connect the environmental sensor to one of the 5 **I2C ports**. **Note:** The sensor needs some time to calibrate. senseBox_bme_tooltip: `Connect the environmental sensor to one of the 5 **I2C ports**. **Note:** The sensor needs some time to calibrate.
@ -206,23 +205,4 @@ The measured values for temperature, humidity and air pressure can be used direc
* *
*/ */
senseBox_watertemperature: "Water Temperature", senseBox_watertemperature: "Water Temperature",
/**
* Feinstaubsensor Sensirion SPS30
*/
senseBox_sps30: "Particulate Matter Sensor (Sensirion SPS30)",
senseBox_sps30_dimension: "in µg/m³",
senseBox_sps30_1p0: "PM1.0",
senseBox_sps30_2p5: "PM2.5",
senseBox_sps30_4p0: "PM4.0",
senseBox_sps30_10p0: "PM10",
senseBox_sps30_tooltip:
"This block gives you the measured value of the Sensirion SPS30 fine dust sensor. Connect the fine dust sensor to one of the 5 **I2C** connectors. Select between PM1.0, PM2.5, PM4.0 and PM10 in the dropdown menu. The measured value will be displayed as **decimal** in µg/m3",
senseBox_sps30_helpurl:
"https://docs.sensebox.de/hardware/sensoren-feinstaub/",
}; };

View File

@ -8,15 +8,11 @@ export const UI = {
toolbox_math: "Math", toolbox_math: "Math",
toolbox_io: "Input/Output", toolbox_io: "Input/Output",
toolbox_time: "Time", toolbox_time: "Time",
toolbox_rtc: "RTC",
toolbox_ntp: "NTP",
toolbox_functions: "Functions", toolbox_functions: "Functions",
toolbox_variables: "Variables", toolbox_variables: "Variables",
toolbox_serial: "Serial", toolbox_serial: "Serial",
toolbox_advanced: "Erweitert", toolbox_advanced: "Erweitert",
toolbox_motors: "Motors", toolbox_motors: "Motors",
toolbox_label_externalRTC: "External RTC",
toolbox_label_internalRTC: "Internal RTC",
variable_NUMBER: "Number (int)", variable_NUMBER: "Number (int)",
variable_SHORT_NUMBER: "char", variable_SHORT_NUMBER: "char",
variable_LONG: "Big number (long)", variable_LONG: "Big number (long)",
@ -308,14 +304,11 @@ export const UI = {
"Your code will now be compiled and then downloaded to your computer", "Your code will now be compiled and then downloaded to your computer",
/** /**
* Device Selection * Device Selction
* */ * */
deviceselection_head: "Which board are you using?", deviceselection_head: "Which board are you using?",
deviceselection_keep_selection: deviceselection_keep_selection: "Save my choice (You can change the board later in the settings)",
"Save my choice (You can change the board later in the settings)", deviceselection_footnote: "Here you can access the old blockly Version for the",
deviceselection_footnote:
"Here you can access the old blockly Version for the",
deviceselection_footnote_02: "or the", deviceselection_footnote_02: "or the",
/** /**

View File

@ -1,5 +1,5 @@
import React from "react"; import React from "react";
import { Block, Value, Field, Shadow, Category, Sep, Label } from "../"; import { Block, Value, Field, Shadow, Category } from "../";
import { getColour } from "../helpers/colour"; import { getColour } from "../helpers/colour";
import "@blockly/block-plus-minus"; import "@blockly/block-plus-minus";
import { TypedVariableModal } from "@blockly/plugin-typed-variable-modal"; import { TypedVariableModal } from "@blockly/plugin-typed-variable-modal";
@ -61,7 +61,6 @@ class Toolbox extends React.Component {
<Block type="sensebox_sensor_uv_light" /> <Block type="sensebox_sensor_uv_light" />
<Block type="sensebox_sensor_bmx055_accelerometer" /> <Block type="sensebox_sensor_bmx055_accelerometer" />
<Block type="sensebox_sensor_sds011" /> <Block type="sensebox_sensor_sds011" />
<Block type="sensebox_sensor_sps30" />
<Block type="sensebox_sensor_pressure" /> <Block type="sensebox_sensor_pressure" />
<Block type="sensebox_sensor_dps310" /> <Block type="sensebox_sensor_dps310" />
<Block type="sensebox_sensor_bme680_bsec" /> <Block type="sensebox_sensor_bme680_bsec" />
@ -503,12 +502,6 @@ class Toolbox extends React.Component {
<Block type="time_micros"></Block> <Block type="time_micros"></Block>
<Block type="infinite_loop"></Block> <Block type="infinite_loop"></Block>
<Block type="sensebox_interval_timer"></Block> <Block type="sensebox_interval_timer"></Block>
<Category
id="time"
name={Blockly.Msg.toolbox_rtc}
colour={getColour().time}
>
<Label text={Blockly.Msg.toolbox_label_externalRTC}></Label>
<Block type="sensebox_rtc_init"></Block> <Block type="sensebox_rtc_init"></Block>
<Block type="sensebox_rtc_set"> <Block type="sensebox_rtc_set">
<Value name="second"> <Value name="second">
@ -545,21 +538,6 @@ class Toolbox extends React.Component {
{/* <Block type="sensebox_rtc_set_ntp"></Block> */} {/* <Block type="sensebox_rtc_set_ntp"></Block> */}
<Block type="sensebox_rtc_get"></Block> <Block type="sensebox_rtc_get"></Block>
<Block type="sensebox_rtc_get_timestamp"></Block> <Block type="sensebox_rtc_get_timestamp"></Block>
<Sep gap="40"></Sep>
<Label text={Blockly.Msg.toolbox_label_internalRTC}></Label>
<Block type="sensebox_internal_rtc_init"></Block>
<Block type="sensebox_internal_rtc_set"></Block>
<Block type="sensebox_internal_rtc_get"></Block>
<Block type="sensebox_internal_rtc_get_timestamp"></Block>
</Category>
<Category
id="timeUTP"
name={Blockly.Msg.toolbox_ntp}
colour={getColour().time}
>
<Block type="sensebox_ntp_init"></Block>
<Block type="sensebox_ntp_get"></Block>
</Category>
</Category> </Category>
<Category <Category
id="math" id="math"
@ -633,11 +611,6 @@ class Toolbox extends React.Component {
colour={getColour().procedures} colour={getColour().procedures}
custom="PROCEDURE" custom="PROCEDURE"
></Category> ></Category>
<Category name="CleVerLab" colour={getColour().cleverlab}>
<Block type="CleVerLab_pH" />
<Block type="CleVerLab_pump" />
<Block type="CleVerLab_cali1" />
</Category>
<Category name={Blockly.Msg.toolbox_advanced} colour={getColour().io}> <Category name={Blockly.Msg.toolbox_advanced} colour={getColour().io}>
<Category <Category
name={Blockly.Msg.toolbox_serial} name={Blockly.Msg.toolbox_serial}
@ -669,10 +642,7 @@ class Toolbox extends React.Component {
</Value> </Value>
</Block> </Block>
</Category> </Category>
<Category <Category name={Blockly.Msg.toolbox_motors} colour={getColour().motors}>
name={Blockly.Msg.toolbox_motors}
colour={getColour().motors}
>
<Block type="sensebox_motors_beginServoMotor" /> <Block type="sensebox_motors_beginServoMotor" />
<Block type="sensebox_motors_moveServoMotor"> <Block type="sensebox_motors_moveServoMotor">
<Value name="degrees"> <Value name="degrees">

View File

@ -1,4 +1,4 @@
import React from "react"; import React, { useEffect } from "react";
import Blockly from "blockly"; import Blockly from "blockly";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import Accordion from "@mui/material/Accordion"; import Accordion from "@mui/material/Accordion";
@ -10,17 +10,20 @@ import { useMonaco } from "@monaco-editor/react";
import { Button } from "@mui/material"; import { Button } from "@mui/material";
import SerialMonitor from "./SerialMonitor.js"; import SerialMonitor from "./SerialMonitor.js";
import axios from "axios"; import axios from "axios";
import { useDispatch } from "react-redux";
import { getArduinoExamples } from "../../actions/arduinoActions";
//import getArduinoExamples from "../../reducers/arduinoReducer"
const Sidebar = () => { const Sidebar = () => {
//const [examples, setExamples] = React.useState([]);
const examples = useSelector((state) => state.arduino.examples);
const user = useSelector((state) => state.auth.user); const user = useSelector((state) => state.auth.user);
// useEffect(() => { const dispatch = useDispatch()
// axios
// .get("https://coelho.opensensemap.org/items/blocklysamples") useEffect(() => {
// .then((res) => { dispatch(getArduinoExamples());
// setExamples(res.data.data); }, [dispatch]);
// });
// }, []);
const monaco = useMonaco(); const monaco = useMonaco();
const loadCode = (code) => { const loadCode = (code) => {
monaco.editor.getModels()[0].setValue(code); monaco.editor.getModels()[0].setValue(code);
@ -52,7 +55,7 @@ const Sidebar = () => {
</AccordionDetails> </AccordionDetails>
</Accordion> </Accordion>
) : null} ) : null}
{/* <Accordion> <Accordion>
<AccordionSummary <AccordionSummary
expandIcon={""} expandIcon={""}
aria-controls="panel1a-content" aria-controls="panel1a-content"
@ -71,13 +74,13 @@ const Sidebar = () => {
key={i} key={i}
onClick={() => loadCode(object.code)} onClick={() => loadCode(object.code)}
> >
{object.name} {object.title}
</Button> </Button>
); );
})} })}
</Typography> </Typography>
</AccordionDetails> </AccordionDetails>
</Accordion> */} </Accordion>
{user ? ( {user ? (
<Accordion> <Accordion>
<AccordionSummary <AccordionSummary

View File

@ -15,15 +15,22 @@ import { setBoard } from './Blockly/helpers/board';
class Content extends Component { class Content extends Component {
componentDidMount() { componentDidMount() {
console.log(this.props.board);
setBoard(this.props.board)
if (this.props.language === 'de_DE') { if (this.props.language === 'de_DE') {
Blockly.setLocale(De); Blockly.setLocale(De);
} else if (this.props.language === 'en_US') { } else if (this.props.language === 'en_US') {
Blockly.setLocale(En); Blockly.setLocale(En);
} }
setBoard(this.props.board)
} }
componentDidUpdate(props) { componentDidUpdate(props) {
console.log(props.board);
console.log(this.props.board);
// if (props.board !== this.props.board) {
setBoard(this.props.board);
if (props.language !== this.props.language) { if (props.language !== this.props.language) {
if (this.props.language === 'de_DE') { if (this.props.language === 'de_DE') {
Blockly.setLocale(De); Blockly.setLocale(De);
@ -31,7 +38,7 @@ class Content extends Component {
Blockly.setLocale(En); Blockly.setLocale(En);
} }
} }
setBoard(this.props.board)
} }
render() { render() {

View File

@ -5,8 +5,8 @@ import Dialog from "./Dialog";
import withStyles from '@mui/styles/withStyles'; import withStyles from '@mui/styles/withStyles';
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { setBoard } from "../actions/boardActions";
import { IconButton, Grid, Avatar, Typography } from "@mui/material"; import { IconButton, Grid, Avatar, Typography } from "@mui/material";
import { setBoard } from "../actions/boardAction";
const styles = (theme) => ({ const styles = (theme) => ({
link: { link: {

View File

@ -2,10 +2,10 @@ 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 { clearStats, workspaceName } from "../actions/workspaceActions"; import { clearStats, workspaceName } from "../actions/workspaceActions";
import { setBoard } from "../actions/boardActions";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import { createNameId } from "mnemonic-id"; import { createNameId } from "mnemonic-id";
import * as BoardHelper from "./Blockly/helpers/board";
import WorkspaceStats from "./Workspace/WorkspaceStats"; import WorkspaceStats from "./Workspace/WorkspaceStats";
import WorkspaceFunc from "./Workspace/WorkspaceFunc"; import WorkspaceFunc from "./Workspace/WorkspaceFunc";
import BlocklyWindow from "./Blockly/BlocklyWindow"; import BlocklyWindow from "./Blockly/BlocklyWindow";
@ -66,6 +66,10 @@ class Home extends Component {
this.setState({ stats: window.localStorage.getItem("stats") }); this.setState({ stats: window.localStorage.getItem("stats") });
if (!this.props.project) { if (!this.props.project) {
this.props.workspaceName(createNameId()); this.props.workspaceName(createNameId());
} else {
console.log(this.props.project);
this.props.setBoard(this.props.project.board);
BoardHelper.setBoard(this.props.project.board);
} }
if (this.props.message && this.props.message.id === "GET_SHARE_FAIL") { if (this.props.message && this.props.message.id === "GET_SHARE_FAIL") {
this.setState({ this.setState({
@ -187,7 +191,8 @@ class Home extends Component {
</Grid> </Grid>
) : null} ) : null}
</Grid> </Grid>
<DeviceSelection /> {!this.props.board ? <DeviceSelection /> : null}
{/* <DeviceSelection /> */}
{/* <HintTutorialExists /> */} {/* <HintTutorialExists /> */}
{this.props.platform ? ( {this.props.platform ? (
<Dialog <Dialog
@ -220,6 +225,7 @@ class Home extends Component {
} }
Home.propTypes = { Home.propTypes = {
setBoard: PropTypes.func.isRequired,
clearStats: PropTypes.func.isRequired, clearStats: PropTypes.func.isRequired,
workspaceName: PropTypes.func.isRequired, workspaceName: PropTypes.func.isRequired,
message: PropTypes.object.isRequired, message: PropTypes.object.isRequired,
@ -231,8 +237,9 @@ const mapStateToProps = (state) => ({
message: state.message, message: state.message,
statistics: state.general.statistics, statistics: state.general.statistics,
platform: state.general.platform, platform: state.general.platform,
board: state.board.board
}); });
export default connect(mapStateToProps, { clearStats, workspaceName })( export default connect(mapStateToProps, { clearStats, workspaceName, setBoard })(
withStyles(styles, { withTheme: true })(Home) withStyles(styles, { withTheme: true })(Home)
); );

View File

@ -37,20 +37,10 @@ import {
faLightbulb, faLightbulb,
faCode, faCode,
faPuzzlePiece, faPuzzlePiece,
faUser,
faMicrochip,
faEarthEurope,
faEarthAmericas,
faCaretDown
} from "@fortawesome/free-solid-svg-icons"; } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@mui/material/Tooltip";
import MenuItem from '@mui/material/MenuItem'
import Menu from '@mui/material/Menu'
import { setLanguage } from "../actions/generalActions";
import { setBoard } from "../actions/boardAction";
import { Button } from "@mui/material";
const styles = (theme) => ({ const styles = (theme) => ({
drawerWidth: { drawerWidth: {
@ -70,14 +60,9 @@ const styles = (theme) => ({
class Navbar extends Component { class Navbar extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.langRef = React.createRef();
this.mcuRef = React.createRef();
this.state = { this.state = {
open: false, open: false,
isTourOpen: false, isTourOpen: false,
anchorElLang: null,
anchorElBoard: null,
anchorElUser: null
}; };
} }
@ -95,6 +80,7 @@ class Navbar extends Component {
render() { render() {
var isHome = /^\/(\/.*$|$)/g.test(this.props.location.pathname); var isHome = /^\/(\/.*$|$)/g.test(this.props.location.pathname);
var isTutorial = /^\/tutorial(\/.*$|$)/g.test(this.props.location.pathname);
var isAssessment = var isAssessment =
/^\/tutorial\/.{1,}$/g.test(this.props.location.pathname) && /^\/tutorial\/.{1,}$/g.test(this.props.location.pathname) &&
!this.props.tutorialIsLoading && !this.props.tutorialIsLoading &&
@ -141,128 +127,20 @@ class Navbar extends Component {
<Link to={"/"} style={{ marginLeft: "10px" }}> <Link to={"/"} style={{ marginLeft: "10px" }}>
<img src={senseboxLogo} alt="senseBox-Logo" width="30" /> <img src={senseboxLogo} alt="senseBox-Logo" width="30" />
</Link> </Link>
<div style={{ margin: "0 0 0 auto", display: "flex", alignItems: 'center', justifyContent: 'center' }}> {isTutorial ? (
{isHome ? ( <Link
<div style={{ display: "flex" }}> to={"/tutorial"}
<div style={{ padding: "12px" }}> style={{
<Button textDecoration: "none",
style={{ textTransform: 'none', cursor: "pointer", alignItems: "center", alignContent: "center", background: "transparent", color: "inherit", fontWeight: "bold", border: "2px solid white", borderRadius: "25px" }} color: "inherit",
ref={this.mcuRef} marginLeft: "10px",
onClick={() => {
this.setState({ anchorElBoard: this.mcuRef.current })
}}
startIcon={<FontAwesomeIcon icon={faMicrochip} />}
endIcon={<FontAwesomeIcon icon={faCaretDown} />}
sx={{ display: { xs: "none", sm: "none", md: "flex" } }}
>
{this.props.selectedBoard}
</Button>
<Menu
anchorEl={this.state.anchorElBoard}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
open={Boolean(this.state.anchorElBoard)}
onClose={() => {
this.setState({ anchorElBoard: null });
}} }}
> >
<MenuItem <Typography variant="h6" noWrap>
value="mcu" Tutorial
onClick={(event) => { </Typography>
this.props.setBoard(event.currentTarget.getAttribute("value")); </Link>
this.setState({ anchorElBoard: null }); ) : null}
}}
>
mcu
</MenuItem>
<MenuItem
value="mini"
onClick={(event) => {
this.props.setBoard(event.currentTarget.getAttribute("value"));
this.setState({ anchorElBoard: null });
}}
>
mini
</MenuItem>
</Menu>
</div>
<div style={{ padding: "12px" }}>
{
this.props.language === "en_US" ?
(
<Button
style={{ textTransform: 'none', cursor: "pointer", alignItems: "center", alignContent: "center", background: "transparent", color: "inherit", fontWeight: "bold", border: "2px solid white", borderRadius: "25px" }}
ref={this.langRef}
onClick={() => {
this.setState({ anchorElLang: this.langRef.current })
}}
startIcon={<FontAwesomeIcon icon={faEarthAmericas} />}
endIcon={<FontAwesomeIcon icon={faCaretDown} />}
sx={{ display: { xs: "none", sm: "none", md: "flex" } }}
>
English
</Button>
) : (
<Button
style={{ textTransform: 'none', cursor: "pointer", alignItems: "center", alignContent: "center", background: "transparent", color: "inherit", fontWeight: "bold", border: "2px solid white", borderRadius: "25px" }}
ref={this.langRef}
onClick={() => {
this.setState({ anchorElLang: this.langRef.current })
}}
startIcon={<FontAwesomeIcon icon={faEarthEurope} />}
endIcon={<FontAwesomeIcon icon={faCaretDown} />}
sx={{ display: { xs: "none", sm: "none", md: "flex" } }}
>
Deutsch
</Button>
)
}
<Menu
anchorEl={this.state.anchorElLang}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
open={Boolean(this.state.anchorElLang)}
onClose={() => {
this.setState({ anchorElLang: null });
}}
>
<MenuItem
value="de_DE"
onClick={(event) => {
this.props.setLanguage(event.currentTarget.getAttribute("value"));
this.setState({ anchorElLang: null });
}}
>
Deutsch
</MenuItem>
<MenuItem
value="en_US"
onClick={(event) => {
this.props.setLanguage(event.currentTarget.getAttribute("value"));
this.setState({ anchorElLang: null });
}}
>
English
</MenuItem>
</Menu>
</div>
</div>
) : (null)}
{isHome ? ( {isHome ? (
<Tooltip title={'Start Tour'} arrow> <Tooltip title={'Start Tour'} arrow>
<IconButton <IconButton
@ -271,6 +149,7 @@ class Navbar extends Component {
onClick={() => { onClick={() => {
this.openTour(); this.openTour();
}} }}
style={{ margin: "0 30px 0 auto" }}
size="large"> size="large">
<FontAwesomeIcon icon={faQuestionCircle} /> <FontAwesomeIcon icon={faQuestionCircle} />
</IconButton> </IconButton>
@ -284,6 +163,7 @@ class Navbar extends Component {
onClick={() => { onClick={() => {
this.openTour(); this.openTour();
}} }}
style={{ margin: "0 30px 0 auto" }}
size="large"> size="large">
<FontAwesomeIcon icon={faQuestionCircle} /> <FontAwesomeIcon icon={faQuestionCircle} />
</IconButton> </IconButton>
@ -296,71 +176,6 @@ class Navbar extends Component {
this.closeTour(); this.closeTour();
}} }}
/> />
{this.props.user ? (
<div>
<IconButton
color="inherit"
onClick={(event) => { this.setState({ anchorElUser: event.target }) }}
style={{ margin: "0 30px 0 0" }}
size="large"
>
<FontAwesomeIcon icon={faUser} />
</IconButton>
<Menu
anchorEl={this.state.anchorElUser}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
open={Boolean(this.state.anchorElUser)}
onClose={() => { this.setState({ anchorElUser: null }); }}
>
<div className="" style={{ paddingLeft: "16px", paddingRight: "16px", paddingTop: "16px" }}>
<p style={{ fontWeight: "bold", margin: "0px" }}>
{this.props.user.name}
</p>
<p style={{ marginTop: "0px", color: "#696969" }}>
{this.props.user.email}
</p>
</div>
<hr style={{ borderTop: "3px solid #bbb", marginLeft: "5px", marginRight: "5px" }} />
<MenuItem>
<Link to={"/user"} style={{ textDecoration: 'none', color: "black" }}>
{Blockly.Msg.navbar_account}
</Link>
</MenuItem>
<MenuItem>
<Link to={"/settings"} style={{ textDecoration: 'none', color: "black" }}>
{Blockly.Msg.navbar_settings}
</Link>
</MenuItem>
<MenuItem
onClick={() => {
this.props.logout()
}}
>
{Blockly.Msg.navbar_logout}
</MenuItem>
</Menu>
</div>
)
:
(<Link to={"/user/login"} style={{ textDecoration: 'none', color: "white" }}>
<IconButton
color="inherit"
style={{ margin: "0 30px 0 auto" }}
>
<FontAwesomeIcon icon={faUser} />
</IconButton>
</Link>
)
}
</div>
</Toolbar> </Toolbar>
</AppBar> </AppBar>
<Drawer <Drawer
@ -554,10 +369,6 @@ Navbar.propTypes = {
user: PropTypes.object, user: PropTypes.object,
tutorial: PropTypes.object, tutorial: PropTypes.object,
activeStep: PropTypes.number.isRequired, activeStep: PropTypes.number.isRequired,
setLanguage: PropTypes.func.isRequired,
language: PropTypes.string.isRequired,
setBoard: PropTypes.func.isRequired,
selectedBoard: PropTypes.string.isRequired
}; };
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
@ -567,10 +378,8 @@ const mapStateToProps = (state) => ({
user: state.auth.user, user: state.auth.user,
tutorial: state.tutorial.tutorials[0], tutorial: state.tutorial.tutorials[0],
activeStep: state.tutorial.activeStep, activeStep: state.tutorial.activeStep,
language: state.general.language,
selectedBoard: state.board.board
}); });
export default connect(mapStateToProps, { logout, setLanguage, setBoard })( export default connect(mapStateToProps, { logout })(
withStyles(styles, { withTheme: true })(withRouter(Navbar)) withStyles(styles, { withTheme: true })(withRouter(Navbar))
); );

View File

@ -1,7 +1,7 @@
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 { visitPage, setPlatform } from "../../actions/generalActions"; import { visitPage } from "../../actions/generalActions";
import { Route, Switch, withRouter } from "react-router-dom"; import { Route, Switch, withRouter } from "react-router-dom";
@ -27,24 +27,6 @@ import Faq from "../Faq";
import CodeEditor from "../CodeEditor/CodeEditor"; import CodeEditor from "../CodeEditor/CodeEditor";
class Routes extends Component { class Routes extends Component {
componentDidMount() {
const { location } = this.props;
const query = new URLSearchParams(location.search, [location.search]);
const mode = query.get('mode');
if (!this.props.platform && mode) {
switch (mode.toLowerCase()) {
case 'tablet':
this.props.setPlatform(true);
break;
default:
break;
}
}
}
componentDidUpdate() { componentDidUpdate() {
this.props.visitPage(); this.props.visitPage();
} }
@ -123,12 +105,6 @@ class Routes extends Component {
Home.propTypes = { Home.propTypes = {
visitPage: PropTypes.func, visitPage: PropTypes.func,
platform: PropTypes.bool.isRequired,
setPlatform: PropTypes.func.isRequired
}; };
const mapStateToProps = (state) => ({ export default connect(null, { visitPage })(withRouter(Routes));
platform: state.general.platform,
});
export default connect(mapStateToProps, { visitPage, setPlatform })(withRouter(Routes));

View File

@ -1,7 +1,7 @@
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 { setBoard } from '../../actions/boardAction'; import { setBoard } from '../../actions/boardActions';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';

View File

@ -91,8 +91,11 @@ class SaveProject extends Component {
saveProject = () => { saveProject = () => {
var body = { var body = {
xml: this.props.xml, xml: this.props.xml,
title: this.props.name title: this.props.name,
board: this.props.board,
type: "blockly"
}; };
console.log(body);
if (this.state.projectType === 'gallery') { if (this.state.projectType === 'gallery') {
body.description = this.state.description; body.description = this.state.description;
} }
@ -210,7 +213,8 @@ const mapStateToProps = state => ({
description: state.project.description, description: state.project.description,
xml: state.workspace.code.xml, xml: state.workspace.code.xml,
message: state.message, message: state.message,
user: state.auth.user user: state.auth.user,
board: state.board.board,
}); });
export default connect(mapStateToProps, { updateProject, setDescription })(withStyles(styles, { withTheme: true })(withRouter(SaveProject))); export default connect(mapStateToProps, { updateProject, setDescription })(withStyles(styles, { withTheme: true })(withRouter(SaveProject)));

View File

@ -4,22 +4,12 @@
"name": "senseBox MCU", "name": "senseBox MCU",
"src": "senseboxmcu.png", "src": "senseboxmcu.png",
"url": "https://docs.sensebox.de/hardware/allgemein-sensebox-mcu/", "url": "https://docs.sensebox.de/hardware/allgemein-sensebox-mcu/",
"category": "boards",
"description": "test" "description": "test"
}, },
{
"id": "senseboxmcumini",
"name": "senseBox MCU:mini",
"src": "senseboxmcumini.png",
"url": "https://docs.sensebox.de/hardware/allgemein-sensebox-mcu-mini/",
"category": "boards",
"description": ""
},
{ {
"id": "breadboard", "id": "breadboard",
"name": "Breadboard", "name": "Breadboard",
"src": "breadboard.png", "src": "breadboard.png",
"category": "misc",
"url": "" "url": ""
}, },
{ {
@ -66,16 +56,10 @@
}, },
{ {
"id": "feinstaub", "id": "feinstaub",
"name": "Feinstaubsensor (SDS011)", "name": "Feinstaubsensor",
"src": "feinstaub.png", "src": "feinstaub.png",
"url": "https://docs.sensebox.de/hardware/sensoren-feinstaub/" "url": "https://docs.sensebox.de/hardware/sensoren-feinstaub/"
}, },
{
"id": "feinstaub-sps30",
"name": "Feinstaubsensor (SPS30)",
"src": "sps30.png",
"url": "https://docs.sensebox.de/hardware/sensoren-feinstaub/"
},
{ {
"id": "gps", "id": "gps",
"name": "GPS-Modul", "name": "GPS-Modul",
@ -156,14 +140,8 @@
}, },
{ {
"id": "ds1820b", "id": "ds1820b",
"name": "Wassertemperatur Sensor", "name": "Wassertemperatur",
"src": "wassertemp.png", "src": "ws2818.png",
"url": ""
},
{
"id": "expander",
"name": "I2C Expander",
"src": "expander.png",
"url": "" "url": ""
}, },
{ {
@ -184,18 +162,6 @@
"src": "jst-jst.png", "src": "jst-jst.png",
"url": "" "url": ""
}, },
{
"id": "jst-qwiic",
"name": "JST-QWIIC Kabel",
"src": "jst-qwiic.png",
"url": ""
},
{
"id": "qwiic-qwiic",
"name": "QWIIC-QWICC Kabel",
"src": "qwiic-qwiic.png",
"url": ""
},
{ {
"id": "jumperwire", "id": "jumperwire",
"name": "Steckkabel", "name": "Steckkabel",

View File

@ -0,0 +1,20 @@
import { GET_ARDUINO_EXAMPLES } from '../actions/types';
const initialState = {
examples: [],
type: '',
description: '',
progress: false
};
export default function foo(state = initialState, action) {
switch (action.type) {
case GET_ARDUINO_EXAMPLES:
return {
...state,
examples: action.payload
};
default:
return state;
}
}

View File

@ -8,6 +8,7 @@ import messageReducer from './messageReducer';
import authReducer from './authReducer'; import authReducer from './authReducer';
import boardReducer from './boardReducer'; import boardReducer from './boardReducer';
import sensorwikiReducer from './sensorwikiReducer'; import sensorwikiReducer from './sensorwikiReducer';
import arduinoReducer from './arduinoReducer';
export default combineReducers({ export default combineReducers({
auth: authReducer, auth: authReducer,
@ -18,5 +19,6 @@ export default combineReducers({
project: projectReducer, project: projectReducer,
general: generalReducer, general: generalReducer,
message: messageReducer, message: messageReducer,
sensorwiki: sensorwikiReducer sensorwiki: sensorwikiReducer,
arduino: arduinoReducer
}); });