From 21d282ee1b9ebe95436788ed4980f92afda128a0 Mon Sep 17 00:00:00 2001 From: Mario Pesch Date: Tue, 30 Mar 2021 15:03:34 +0200 Subject: [PATCH] add multiplexer closes #81 --- src/components/Blockly/blocks/sensebox.js | 36 +++++++- src/components/Blockly/generator/index.js | 47 +++++----- src/components/Blockly/generator/sensebox.js | 39 +++++++- src/components/Blockly/msg/de.js | 93 ++++++++++---------- src/components/Blockly/msg/de/sensebox.js | 16 ++++ src/components/Blockly/msg/en.js | 92 +++++++++---------- src/components/Blockly/msg/en/sensebox.js | 16 ++++ src/components/Blockly/toolbox/Toolbox.js | 14 +++ src/components/User/Login.js | 1 + src/reducers/authReducer.js | 42 +++++---- 10 files changed, 261 insertions(+), 135 deletions(-) create mode 100644 src/components/Blockly/msg/de/sensebox.js create mode 100644 src/components/Blockly/msg/en/sensebox.js diff --git a/src/components/Blockly/blocks/sensebox.js b/src/components/Blockly/blocks/sensebox.js index fd40910..5260e89 100644 --- a/src/components/Blockly/blocks/sensebox.js +++ b/src/components/Blockly/blocks/sensebox.js @@ -1,4 +1,36 @@ +import * as Blockly from "blockly/core"; +import { getColour } from "../helpers/colour"; +import * as Types from "../helpers/types"; +Blockly.Blocks["sensebox_multiplexer_init"] = { + init: function () { + this.appendDummyInput().appendField(Blockly.Msg.senseBox_multiplexer_init); + this.appendValueInput("nrChannels").setCheck( + Types.getCompatibleTypes("int") + ); + this.appendDummyInput().appendField( + Blockly.Msg.senseBox_multplexer_nchannels + ); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline("true"); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.senseBox_multiplexer_init_tooltip); + this.setHelpUrl(Blockly.Msg.senseBox_multiplexer_init_helpurl); + }, +}; - - +Blockly.Blocks["sensebox_multiplexer_changeChannel"] = { + init: function () { + this.appendDummyInput().appendField( + Blockly.Msg.senseBox_multiplexer_changeChannel + ); + this.appendValueInput("Channel").setCheck(Types.getCompatibleTypes("int")); + this.setInputsInline("true"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.sensebox_multiplexer_changeChannel_tooltip); + this.setHelpUrl(Blockly.Msg.sensebox_multiplexer_changeChannel_helpurl); + }, +}; diff --git a/src/components/Blockly/generator/index.js b/src/components/Blockly/generator/index.js index 04f337f..9278a5b 100644 --- a/src/components/Blockly/generator/index.js +++ b/src/components/Blockly/generator/index.js @@ -1,24 +1,23 @@ -import './generator'; -import './loops'; -import './sensebox-sensors'; -import './sensebox-telegram'; -import './sensebox-osem'; -import './sensebox-web'; -import './sensebox-display'; -import './sensebox-lora'; -import './sensebox-led'; -import './sensebox-sd'; -import './mqtt'; -import './logic'; -import './text'; -import './math'; -import './map'; -import './io'; -import './audio'; -import './procedures'; -import './time'; -import './variables'; -import './lists'; -import './webserver'; - - +import "./generator"; +import "./loops"; +import "./sensebox-sensors"; +import "./sensebox-telegram"; +import "./sensebox-osem"; +import "./sensebox-web"; +import "./sensebox-display"; +import "./sensebox-lora"; +import "./sensebox-led"; +import "./sensebox-sd"; +import "./sensebox"; +import "./mqtt"; +import "./logic"; +import "./text"; +import "./math"; +import "./map"; +import "./io"; +import "./audio"; +import "./procedures"; +import "./time"; +import "./variables"; +import "./lists"; +import "./webserver"; diff --git a/src/components/Blockly/generator/sensebox.js b/src/components/Blockly/generator/sensebox.js index 9975a36..d4ba404 100644 --- a/src/components/Blockly/generator/sensebox.js +++ b/src/components/Blockly/generator/sensebox.js @@ -1,3 +1,38 @@ -import * as Blockly from 'blockly/core'; -import { Block } from 'blockly'; +import * as Blockly from "blockly/core"; +/* + * Multiplexer + */ +Blockly.Arduino.sensebox_multiplexer_init = function () { + // Blockly.Arduino.libraries_['library_spi'] = '#include '; + var nrChannels = + Blockly.Arduino.valueToCode( + this, + "nrChannels", + Blockly.Arduino.ORDER_ATOMIC + ) | 0; + var array = []; + for (var i = 0; i < nrChannels; i++) { + array.push(i); + } + Blockly.Arduino.libraries_["library_wire"] = "#include "; + Blockly.Arduino.definitions_[ + "define_multiplexer" + ] = `byte multiplexAddress = 0x77; + byte channels[] = {${array}};`; + // Blockly.Arduino.setupCode_['sensebox_display_begin'] = 'senseBoxIO.powerI2C(true);\ndelay(2000);\ndisplay.begin(SSD1306_SWITCHCAPVCC, 0x3D);\ndisplay.display();\ndelay(100);\ndisplay.clearDisplay();'; + var code = ""; + return code; +}; + +Blockly.Arduino.sensebox_multiplexer_changeChannel = function () { + var channel = Blockly.Arduino.valueToCode( + this, + "Channel", + Blockly.Arduino.ORDER_ATOMIC + ); + var code = `Wire.beginTransmission(0x77); + Wire.write(1 << channels[${channel - 1}]); + Wire.endTransmission();`; + return code; +}; diff --git a/src/components/Blockly/msg/de.js b/src/components/Blockly/msg/de.js index aff10ad..4e8e246 100644 --- a/src/components/Blockly/msg/de.js +++ b/src/components/Blockly/msg/de.js @@ -1,48 +1,49 @@ - -import { AUDIO } from './de/audio'; -import { FAQ } from './de/faq'; -import { IO } from './de/io'; -import { LOGIC } from './de/logic'; -import { LOOPS } from './de/loops'; -import { MATH } from './de/math'; -import { MQTT } from './de/mqtt'; -import { DISPLAY } from './de/sensebox-display'; -import { LED } from './de/sensebox-led'; -import { LORA } from './de/sensebox-lora'; -import { OSEM } from './de/sensebox-osem'; -import { SD } from './de/sensebox-sd'; -import { SENSORS } from './de/sensebox-sensors'; -import { TELEGRAM } from './de/sensebox-telegram'; -import { WEB } from './de/sensebox-web'; -import { TEXT } from './de/text'; -import { TIME } from './de/time'; -import { TOURS } from './de/tours'; -import { TRANSLATIONS } from './de/translations'; -import { UI } from './de/ui'; -import { VARIABLES } from './de/variables'; -import { WEBSERVER } from './de/webserver'; +import { AUDIO } from "./de/audio"; +import { FAQ } from "./de/faq"; +import { IO } from "./de/io"; +import { LOGIC } from "./de/logic"; +import { LOOPS } from "./de/loops"; +import { MATH } from "./de/math"; +import { MQTT } from "./de/mqtt"; +import { DISPLAY } from "./de/sensebox-display"; +import { LED } from "./de/sensebox-led"; +import { LORA } from "./de/sensebox-lora"; +import { OSEM } from "./de/sensebox-osem"; +import { SD } from "./de/sensebox-sd"; +import { SENSORS } from "./de/sensebox-sensors"; +import { SENSEBOX } from "./de/sensebox"; +import { TELEGRAM } from "./de/sensebox-telegram"; +import { WEB } from "./de/sensebox-web"; +import { TEXT } from "./de/text"; +import { TIME } from "./de/time"; +import { TOURS } from "./de/tours"; +import { TRANSLATIONS } from "./de/translations"; +import { UI } from "./de/ui"; +import { VARIABLES } from "./de/variables"; +import { WEBSERVER } from "./de/webserver"; export const De = { - ...AUDIO, - ...FAQ, - ...IO, - ...LOGIC, - ...LOOPS, - ...MATH, - ...MQTT, - ...DISPLAY, - ...LED, - ...LORA, - ...OSEM, - ...SD, - ...SENSORS, - ...TELEGRAM, - ...WEB, - ...TEXT, - ...TIME, - ...TOURS, - ...TRANSLATIONS, - ...UI, - ...VARIABLES, - ...WEBSERVER -} + ...AUDIO, + ...FAQ, + ...IO, + ...LOGIC, + ...LOOPS, + ...MATH, + ...MQTT, + ...DISPLAY, + ...LED, + ...LORA, + ...OSEM, + ...SD, + ...SENSORS, + ...SENSEBOX, + ...TELEGRAM, + ...WEB, + ...TEXT, + ...TIME, + ...TOURS, + ...TRANSLATIONS, + ...UI, + ...VARIABLES, + ...WEBSERVER, +}; diff --git a/src/components/Blockly/msg/de/sensebox.js b/src/components/Blockly/msg/de/sensebox.js new file mode 100644 index 0000000..5e3d656 --- /dev/null +++ b/src/components/Blockly/msg/de/sensebox.js @@ -0,0 +1,16 @@ +export const SENSEBOX = { + /** + * Multiplexer + */ + senseBox_multiplexer_init: "Initialisiere Multiplexer mit ", + senseBox_multiplexer_init_tooltip: + "Schließe den Multiplexer mit einem JST-JST Kabel an einen der 5 I2C-Ports an. Nun kannst du bis zu 8 gleiche Sensoren verwenden über die entsprechenden Kanäle ansprechen. Gib im Block die Anzahl der verwendeten Kanäle an", + senseBox_multiplexer_init_helpurl: + "https://docs.sensebox.de/hardware/zubehoer-multiplexer/", + senseBox_multplexer_nchannels: "Kanälen", + senseBox_multiplexer_changeChannel: "Wechsel Kanal auf:", + sensebox_multiplexer_changeChannel_tooltip: + "Wähle den entsprechenden Kanal aus", + sensebox_multiplexer_changeChannel_helpurl: + "https://docs.sensebox.de/hardware/zubehoer-multiplexer/", +}; diff --git a/src/components/Blockly/msg/en.js b/src/components/Blockly/msg/en.js index 74d7b9c..3f90f1d 100644 --- a/src/components/Blockly/msg/en.js +++ b/src/components/Blockly/msg/en.js @@ -1,47 +1,49 @@ -import { AUDIO } from './en/audio'; -import { FAQ } from './en/faq'; -import { IO } from './en/io'; -import { LOGIC } from './en/logic'; -import { LOOPS } from './en/loops'; -import { MATH } from './en/math'; -import { MQTT } from './en/mqtt'; -import { DISPLAY } from './en/sensebox-display'; -import { LED } from './en/sensebox-led'; -import { LORA } from './en/sensebox-lora'; -import { OSEM } from './en/sensebox-osem'; -import { SD } from './en/sensebox-sd'; -import { SENSORS } from './en/sensebox-sensors'; -import { TELEGRAM } from './en/sensebox-telegram'; -import { WEB } from './en/sensebox-web'; -import { TEXT } from './en/text'; -import { TIME } from './en/time'; -import { TOURS } from './en/tours'; -import { TRANSLATIONS } from './en/translations'; -import { UI } from './en/ui'; -import { VARIABLES } from './en/variables'; -import { WEBSERVER } from './en/webserver'; +import { AUDIO } from "./en/audio"; +import { FAQ } from "./en/faq"; +import { IO } from "./en/io"; +import { LOGIC } from "./en/logic"; +import { LOOPS } from "./en/loops"; +import { MATH } from "./en/math"; +import { MQTT } from "./en/mqtt"; +import { SENSEBOX } from "./en/sensebox"; +import { DISPLAY } from "./en/sensebox-display"; +import { LED } from "./en/sensebox-led"; +import { LORA } from "./en/sensebox-lora"; +import { OSEM } from "./en/sensebox-osem"; +import { SD } from "./en/sensebox-sd"; +import { SENSORS } from "./en/sensebox-sensors"; +import { TELEGRAM } from "./en/sensebox-telegram"; +import { WEB } from "./en/sensebox-web"; +import { TEXT } from "./en/text"; +import { TIME } from "./en/time"; +import { TOURS } from "./en/tours"; +import { TRANSLATIONS } from "./en/translations"; +import { UI } from "./en/ui"; +import { VARIABLES } from "./en/variables"; +import { WEBSERVER } from "./en/webserver"; export const En = { - ...AUDIO, - ...FAQ, - ...IO, - ...LOGIC, - ...LOOPS, - ...MATH, - ...MQTT, - ...DISPLAY, - ...LED, - ...LORA, - ...OSEM, - ...SD, - ...SENSORS, - ...TELEGRAM, - ...WEB, - ...TEXT, - ...TIME, - ...TOURS, - ...TRANSLATIONS, - ...UI, - ...VARIABLES, - ...WEBSERVER -} + ...AUDIO, + ...FAQ, + ...IO, + ...LOGIC, + ...LOOPS, + ...MATH, + ...MQTT, + ...DISPLAY, + ...LED, + ...LORA, + ...OSEM, + ...SD, + ...SENSORS, + ...SENSEBOX, + ...TELEGRAM, + ...WEB, + ...TEXT, + ...TIME, + ...TOURS, + ...TRANSLATIONS, + ...UI, + ...VARIABLES, + ...WEBSERVER, +}; diff --git a/src/components/Blockly/msg/en/sensebox.js b/src/components/Blockly/msg/en/sensebox.js new file mode 100644 index 0000000..4d4548e --- /dev/null +++ b/src/components/Blockly/msg/en/sensebox.js @@ -0,0 +1,16 @@ +export const SENSEBOX = { + /** + * Multiplexer + */ + senseBox_multiplexer_init: "Initialise Multiplexer with ", + senseBox_multiplexer_init_tooltip: + "Connect the multiplexer with a JST-JST cable to one of the 5 I2C ports. Now you can use up to 8 sensors of the same type and address them via the corresponding channels. Enter the number of used channels in the block", + senseBox_multiplexer_init_helpurl: + "https://en.docs.sensebox.de/hardware/zubehoer-multiplexer/", + senseBox_multplexer_nchannels: "Channels", + senseBox_multiplexer_changeChannel: "Change active channel to:", + sensebox_multiplexer_changeChannel_tooltip: + "Changes the active channel to the selected number", + sensebox_multiplexer_changeChannel_helpurl: + "https://en.docs.sensebox.de/hardware/zubehoer-multiplexer/", +}; diff --git a/src/components/Blockly/toolbox/Toolbox.js b/src/components/Blockly/toolbox/Toolbox.js index 9d65862..9fbae2c 100644 --- a/src/components/Blockly/toolbox/Toolbox.js +++ b/src/components/Blockly/toolbox/Toolbox.js @@ -75,6 +75,20 @@ class Toolbox extends React.Component { {/* */} + + + + 1 + + + + + + + 1 + + + diff --git a/src/components/User/Login.js b/src/components/User/Login.js index 7119b22..0b5a5d3 100644 --- a/src/components/User/Login.js +++ b/src/components/User/Login.js @@ -50,6 +50,7 @@ export class Login extends Component { } // Check for login error else if (message.id === "LOGIN_FAIL") { + console.log("login fail"); this.setState({ email: "", password: "", diff --git a/src/reducers/authReducer.js b/src/reducers/authReducer.js index 5fc01bd..55e6450 100644 --- a/src/reducers/authReducer.js +++ b/src/reducers/authReducer.js @@ -1,59 +1,69 @@ -import { MYBADGES_CONNECT, MYBADGES_DISCONNECT, USER_LOADED, USER_LOADING, AUTH_ERROR, LOGIN_SUCCESS, LOGIN_FAIL, LOGOUT_SUCCESS, LOGOUT_FAIL, REFRESH_TOKEN_SUCCESS } from '../actions/types'; - +import { + MYBADGES_CONNECT, + MYBADGES_DISCONNECT, + USER_LOADED, + USER_LOADING, + AUTH_ERROR, + LOGIN_SUCCESS, + LOGIN_FAIL, + LOGOUT_SUCCESS, + LOGOUT_FAIL, + REFRESH_TOKEN_SUCCESS, +} from "../actions/types"; const initialState = { - token: localStorage.getItem('token'), - refreshToken: localStorage.getItem('refreshToken'), + token: localStorage.getItem("token"), + refreshToken: localStorage.getItem("refreshToken"), isAuthenticated: null, progress: true, - user: null + user: null, }; -export default function foo(state = initialState, action){ - switch(action.type){ +export default function foo(state = initialState, action) { + switch (action.type) { case USER_LOADING: return { ...state, - progress: true + progress: true, }; case USER_LOADED: return { ...state, isAuthenticated: true, progress: false, - user: action.payload + user: action.payload, }; case LOGIN_SUCCESS: case REFRESH_TOKEN_SUCCESS: - localStorage.setItem('token', action.payload.token); - localStorage.setItem('refreshToken', action.payload.refreshToken); + localStorage.setItem("token", action.payload.token); + localStorage.setItem("refreshToken", action.payload.refreshToken); return { ...state, user: action.payload.user, token: action.payload.token, refreshToken: action.payload.refreshToken, isAuthenticated: true, - progress: false + progress: false, }; case MYBADGES_CONNECT: case MYBADGES_DISCONNECT: return { ...state, - user: action.payload + user: action.payload, }; case AUTH_ERROR: case LOGIN_FAIL: case LOGOUT_SUCCESS: case LOGOUT_FAIL: - localStorage.removeItem('token'); - localStorage.removeItem('refreshToken'); + localStorage.removeItem("token"); + localStorage.removeItem("refreshToken"); return { ...state, token: null, refreshToken: null, user: null, isAuthenticated: false, - progress: false + progress: false, }; default: return state;