324 lines
11 KiB
JavaScript
324 lines
11 KiB
JavaScript
import Blockly from 'blockly';
|
|
import { getColour } from '../helpers/colour'
|
|
import * as Types from '../helpers/types'
|
|
import { selectedBoard } from '../helpers/board'
|
|
|
|
/**
|
|
* HDC1080 Temperature and Humidity Sensor
|
|
*
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_sensor_temp_hum'] = {
|
|
init: function () {
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_temp_hum);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_value)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_hum, "Humidity"]]), "NAME");
|
|
this.setOutput(true, Types.DECIMAL.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_temp_hum_tip);
|
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* VEML6070 and TSL4513
|
|
*
|
|
*/
|
|
|
|
|
|
Blockly.Blocks['sensebox_sensor_uv_light'] = {
|
|
init: function () {
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_uv_light);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_value)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_light, "Illuminance"], [Blockly.Msg.senseBox_uv, "UvIntensity"]]), "NAME");
|
|
this.setOutput(true, Types.DECIMAL.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_uv_light_tip);
|
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
|
}
|
|
};
|
|
|
|
/*
|
|
BMX055 Three differen Blocks for Accelerometer, Gyroscope, Compass
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_sensor_bmx055_accelerometer'] = {
|
|
init: function () {
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_bmx055_accelerometer);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_LEFT)
|
|
.appendField(Blockly.Msg.senseBox_bmx055_accelerometer_direction)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_bmx055_accelerometer_direction_x, "X"], [Blockly.Msg.senseBox_bmx055_accelerometer_direction_y, "Y"], [Blockly.Msg.senseBox_bmx055_accelerometer_direction_z, "Z"], [Blockly.Msg.senseBox_bmx055_accelerometer_direction_total, "Total"]]), "VALUE");
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_LEFT)
|
|
.appendField(Blockly.Msg.senseBox_bmx055_accelerometer_range)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_bmx055_accelerometer_range_2g, "0x3"], [Blockly.Msg.senseBox_bmx055_accelerometer_range_4g, "0x5"], [Blockly.Msg.senseBox_bmx055_accelerometer_range_8g, "0x8"], [Blockly.Msg.senseBox_bmx055_accelerometer_range_16g, "0x0C"]]), "RANGE");
|
|
this.setOutput(true, Types.DECIMAL.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_bmx055_accelerometer_tip);
|
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* SDS011 Fine Particular Matter Sensor
|
|
*
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_sensor_sds011'] = {
|
|
init: function () {
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_sds011);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_value)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_sds011_pm25, "Pm25"], [Blockly.Msg.senseBox_sds011_pm10, "Pm10"]]), "NAME")
|
|
.appendField(Blockly.Msg.senseBox_sds011_dimension)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_sds011_serial1, "Serial1"], [Blockly.Msg.senseBox_sds011_serial2, "Serial2"]]), "SERIAL");
|
|
this.setOutput(true, Types.DECIMAL.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_sds011_tip);
|
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/temp_und_luftfeuchte.html');
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* BMP280 Pressure Sensor
|
|
*
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_sensor_pressure'] = {
|
|
init: function () {
|
|
var dropdownOptions = [[Blockly.Msg.senseBox_pressure, "Pressure"], [Blockly.Msg.senseBox_temp, "Temperature"], [Blockly.Msg.senseBox_gps_alt, "Altitude"]];
|
|
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (option) {
|
|
var input = (option === 'Pressure') || (option === 'Temperature') || (option === 'Altitude');
|
|
this.sourceBlock_.updateShape_(input);
|
|
});
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_pressure_sensor);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_value)
|
|
.appendField(dropdown, "NAME");
|
|
this.setColour(getColour().sensebox);
|
|
this.setOutput(true, Types.DECIMAL.typeName);
|
|
this.setTooltip(Blockly.Msg.senseBox_pressure_tip);
|
|
this.setHelpUrl('https://edu.books.sensebox.de/de/projekte/diy_umweltstation/luftdruck.html');
|
|
},
|
|
/**
|
|
* Parse XML to restore the number of pins available.
|
|
* @param {!Element} xmlElement XML storage element.
|
|
* @this Blockly.Block
|
|
*/
|
|
|
|
domToMutation: function (xmlElement) {
|
|
(xmlElement.getAttribute('port'));
|
|
|
|
},
|
|
/**
|
|
* Create XML to represent number of pins selection.
|
|
* @return {!Element} XML storage element.
|
|
* @this Blockly.Block
|
|
*/
|
|
mutationToDom: function () {
|
|
var container = document.createElement('mutation');
|
|
var input = this.getFieldValue('NAME');
|
|
this.updateShape_(input);
|
|
container.setAttribute('NAME', input);
|
|
return container;
|
|
},
|
|
/**
|
|
* Modify this block to have the correct number of pins available.
|
|
* @param {boolean}
|
|
* @private
|
|
* @this Blockly.Block
|
|
*/
|
|
updateShape_: function () {
|
|
var extraFieldExist = this.getFieldValue('referencePressure');
|
|
var input = this.getFieldValue('NAME');
|
|
if (input === 'Altitude' && extraFieldExist === null) {
|
|
this.appendDummyInput('extraField')
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
|
|
.appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
|
|
.appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
|
|
}
|
|
|
|
if ((input === 'Pressure' || input === 'Temperature') && extraFieldExist !== null) {
|
|
this.removeInput('extraField');
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* BME680 Environmental Sensor
|
|
*
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_sensor_bme680_bsec'] = {
|
|
init: function () {
|
|
var dropdownOptions = [[Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"], [Blockly.Msg.senseBox_pressure, "pressure"], [Blockly.Msg.senseBox_bme_iaq, "IAQ"], [Blockly.Msg.senseBox_bme_iaq_accuracy, "IAQAccuracy"], [Blockly.Msg.senseBox_bme_co2, "CO2"], [Blockly.Msg.senseBox_bme_breatheVocEquivalent, "breathVocEquivalent"]];
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_bme680);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_value)
|
|
.appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown")
|
|
this.setOutput(true, Types.DECIMAL.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_bme_tip);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Ultrasonic Sensor
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
Blockly.Blocks['sensebox_sensor_ultrasonic_ranger'] = {
|
|
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']];
|
|
var dropdown = new Blockly.FieldDropdown(dropdownOptions, function (option) {
|
|
var input = (option === 'A') || (option === 'B') || (option === 'C');
|
|
this.sourceBlock_.updateShape_(input);
|
|
});
|
|
|
|
this.setColour(getColour().sensebox);
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_ultrasonic)
|
|
.appendField(dropdown, "port");
|
|
this.appendDummyInput('TrigEcho')
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_ultrasonic_trigger)
|
|
.appendField(new Blockly.FieldDropdown(
|
|
selectedBoard().digitalPins), 'ultrasonic_trigger')
|
|
.appendField(Blockly.Msg.senseBox_ultrasonic_echo)
|
|
.appendField(new Blockly.FieldDropdown(
|
|
selectedBoard().digitalPins), 'ultrasonic_echo');
|
|
this.setOutput(true, Types.NUMBER.typeName);
|
|
this.setTooltip(Blockly.Msg.senseBox_ultrasonic_tip);
|
|
this.setHelpUrl('https://sensebox.de/books');
|
|
},
|
|
/**
|
|
* Parse XML to restore the number of pins available.
|
|
* @param {!Element} xmlElement XML storage element.
|
|
* @this Blockly.Block
|
|
*/
|
|
domToMutation: function (xmlElement) {
|
|
(xmlElement.getAttribute('port'));
|
|
|
|
},
|
|
/**
|
|
* Create XML to represent number of pins selection.
|
|
* @return {!Element} XML storage element.
|
|
* @this Blockly.Block
|
|
*/
|
|
mutationToDom: function () {
|
|
var container = document.createElement('mutation');
|
|
var input = this.getFieldValue('port');
|
|
this.updateShape_(input);
|
|
container.setAttribute("port", input);
|
|
return container;
|
|
},
|
|
/**
|
|
* Modify this block to have the correct number of pins available.
|
|
* @param {boolean}
|
|
* @private
|
|
* @this Blockly.Block
|
|
*/
|
|
updateShape_: function () {
|
|
var input = this.getFieldValue('port');
|
|
switch (input) {
|
|
case 'A':
|
|
this.setFieldValue('1', 'ultrasonic_trigger');
|
|
this.setFieldValue('2', 'ultrasonic_echo');
|
|
break;
|
|
case 'B':
|
|
this.setFieldValue('3', 'ultrasonic_trigger');
|
|
this.setFieldValue('4', 'ultrasonic_echo');
|
|
break;
|
|
case 'C':
|
|
this.setFieldValue('5', 'ultrasonic_trigger');
|
|
this.setFieldValue('6', 'ultrasonic_echo');
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Microphone
|
|
*
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_sensor_sound'] = {
|
|
init: function () {
|
|
this.setColour(getColour().sensebox);
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_sound)
|
|
.appendField("Pin:")
|
|
.appendField(new Blockly.FieldDropdown(selectedBoard().analogPins), "PIN")
|
|
this.setOutput(true, Types.NUMBER.typeName);
|
|
this.setHelpUrl(Blockly.Msg.senseBox_sound_tip);
|
|
this.setTooltip('Dieser Sensor mist den Geräuschpegel.');
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Button
|
|
*
|
|
*
|
|
*/
|
|
|
|
Blockly.Blocks['sensebox_button'] = {
|
|
init: function () {
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_button)
|
|
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_button_isPressed, "isPressed"], [Blockly.Msg.senseBox_button_wasPressed, "wasPressed"], [Blockly.Msg.senseBox_button_switch, "Switch"]]), "FUNCTION")
|
|
.appendField("Pin:")
|
|
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsButton), "PIN");
|
|
this.setOutput(true, Types.BOOLEAN.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_button_tip);
|
|
this.setHelpUrl('https://sensebox.de/books');
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* SCD30 CO2 Sensor
|
|
*
|
|
*/
|
|
|
|
|
|
Blockly.Blocks['sensebox_scd30'] = {
|
|
init: function () {
|
|
var dropdownOptions = [[Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"], [Blockly.Msg.senseBox_bme_co2, "CO2"]];
|
|
this.appendDummyInput()
|
|
.appendField(Blockly.Msg.senseBox_scd30);
|
|
this.appendDummyInput()
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
.appendField(Blockly.Msg.senseBox_value)
|
|
.appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown")
|
|
this.setOutput(true, Types.NUMBER.typeName);
|
|
this.setColour(getColour().sensebox);
|
|
this.setTooltip(Blockly.Msg.senseBox_bme_tip);
|
|
}
|
|
};
|