Compare commits
	
		
			2 Commits
		
	
	
		
			master
			...
			dev/add-mo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 8c4dbadf16 | ||
|  | 53ee280acc | 
| @ -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 }} |  | ||||||
							
								
								
									
										38
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @ -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. |  | ||||||
							
								
								
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							| @ -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. |  | ||||||
							
								
								
									
										14
									
								
								.github/ISSUE_TEMPLATE/short-issue.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/ISSUE_TEMPLATE/short-issue.md
									
									
									
									
										vendored
									
									
								
							| @ -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 |  | ||||||
							
								
								
									
										12
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Dockerfile
									
									
									
									
									
								
							| @ -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;'"] |  | ||||||
| @ -1,11 +0,0 @@ | |||||||
| # docker-compose.yml |  | ||||||
| services: |  | ||||||
|   smarti:  |  | ||||||
|     mem_limit: 2048m |  | ||||||
|     mem_reservation: 128M |  | ||||||
|     cpus: 2 |  | ||||||
|     build: |  | ||||||
|       dockerfile: Dockerfile |  | ||||||
|     ports: |  | ||||||
|     - "80" |  | ||||||
|        |  | ||||||
							
								
								
									
										27
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								package.json
									
									
									
									
									
								
							| @ -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 | 
							
								
								
									
										150
									
								
								src/actions/arduinoActions.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								src/actions/arduinoActions.js
									
									
									
									
									
										Normal 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(''));
 | ||||||
|  | // };
 | ||||||
| @ -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; | ||||||
|  | |||||||
| @ -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"; | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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(''); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| @ -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"; | ||||||
|  | |||||||
| @ -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); |  | ||||||
|   }, |  | ||||||
| }; |  | ||||||
| @ -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); |  | ||||||
|   }, |  | ||||||
| }; |  | ||||||
|  | |||||||
| @ -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); |  | ||||||
|   }, |  | ||||||
| }; |  | ||||||
| @ -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); | ||||||
|   }, |   }, | ||||||
|  | |||||||
| @ -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]; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @ -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" |  | ||||||
| @ -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"; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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]; |  | ||||||
| }; |  | ||||||
| @ -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]; |  | ||||||
| }; |  | ||||||
|  | |||||||
| @ -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]; |  | ||||||
| }; |  | ||||||
|  | |||||||
| @ -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: [ | ||||||
|  | |||||||
| @ -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 = () => { | ||||||
|  | |||||||
| @ -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, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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 }; |  | ||||||
| @ -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, | ||||||
|  | |||||||
| @ -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)", |  | ||||||
| }; |  | ||||||
| @ -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", |  | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -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/", |  | ||||||
|   |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     }; |  | ||||||
|  | |||||||
| @ -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", | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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, | ||||||
|  | |||||||
| @ -1,3 +0,0 @@ | |||||||
| export const CLEVERLAB = { |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| @ -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)", |  | ||||||
| }; |  | ||||||
| @ -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", |  | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -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/", |  | ||||||
|     |  | ||||||
|    |  | ||||||
| 
 |  | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -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", | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | |||||||
| @ -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"> | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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() { | ||||||
|  | |||||||
| @ -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: { | ||||||
|  | |||||||
| @ -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) | ||||||
| ); | ); | ||||||
|  | |||||||
| @ -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)) | ||||||
| ); | ); | ||||||
|  | |||||||
| @ -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)); |  | ||||||
|  | |||||||
| @ -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'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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))); | ||||||
|  | |||||||
| @ -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", | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								src/reducers/arduinoReducer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/reducers/arduinoReducer.js
									
									
									
									
									
										Normal 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; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -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 | ||||||
| }); | }); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user