Merge branch 'master' into boards
This commit is contained in:
@@ -359,7 +359,7 @@ export const sensor_use_i2c_init = {
|
||||
[Blockly.Msg.MixGo_MPU9250+"(ADXL345)", "ADXL345"],
|
||||
["RFID", "RFID"],
|
||||
[Blockly.Msg.MIXLY_RADAR_SENSOR+"(CBR817)", "CBR817"],
|
||||
[Blockly.Msg.MIXLY_AipSpeech_asr+"(CI230X)","CI230X"]
|
||||
[Blockly.Msg.MIXLY_AipSpeech_asr+"(CI130X)","CI130X"]
|
||||
]), "key");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
@@ -402,11 +402,11 @@ export const interaction_whether_to_interaction = {
|
||||
}
|
||||
};
|
||||
|
||||
export const CI230X_IDENTIFY_AND_SAVE = {
|
||||
export const CI130X_IDENTIFY_AND_SAVE = {
|
||||
init:function(){
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
this.appendValueInput('SUB')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI230X')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI130X')
|
||||
.setCheck("var");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_IDENTIFY_ONCE_AND_SAVE)
|
||||
@@ -416,11 +416,11 @@ export const CI230X_IDENTIFY_AND_SAVE = {
|
||||
}
|
||||
};
|
||||
|
||||
export const CI230X_GET_WHETHER_IDENTIFY = {
|
||||
export const CI130X_GET_WHETHER_IDENTIFY = {
|
||||
init:function(){
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
this.appendValueInput('SUB')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI230X')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI130X')
|
||||
.setCheck("var");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_GET)
|
||||
@@ -497,42 +497,35 @@ export const CI230X_GET_WHETHER_IDENTIFY = {
|
||||
}
|
||||
};
|
||||
|
||||
export const CI230X_GET_THE_RECOGNIZED_CMD = {
|
||||
export const CI130X_GET_THE_RECOGNIZED_CMD = {
|
||||
init:function(){
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
this.appendValueInput('SUB')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI230X')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI130X')
|
||||
.setCheck("var");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_GET+Blockly.Msg.MIXLY_THE_RECOGNIZED_CMD);
|
||||
.appendField(Blockly.Msg.MIXLY_GET)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_RECOGNIZED_STATE,"status1"],
|
||||
[Blockly.Msg.MIXLY_WHETHER_BROADCAST,"status2"],
|
||||
[Blockly.Msg.MIXLY_THE_RECOGNIZED_CMD,"result"]
|
||||
]),"key")
|
||||
this.setOutput(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_CI130X_GET_THE_RECOGNIZED_STATE_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const CI230X_GET_THE_RECOGNIZED_STATE = {
|
||||
export const CI130X_BROADCAST = {
|
||||
init:function(){
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
this.appendValueInput('SUB')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI230X')
|
||||
.setCheck("var");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_RECOGNIZED_STATE);
|
||||
this.setOutput(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_CI230X_GET_THE_RECOGNIZED_STATE_TOOLTIP)
|
||||
}
|
||||
}
|
||||
|
||||
export const CI230X_BROADCAST = {
|
||||
init:function(){
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
this.appendValueInput('SUB')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI230X')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI130X')
|
||||
.setCheck("var");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MP3_PLAY)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE,"None"],
|
||||
[Blockly.Msg.MIXLY_WIND_SPEED,"154"],
|
||||
[Blockly.Msg.MIXLY_HYETAL,"155"],
|
||||
[Blockly.Msg.MIXLY_TEMPERATURE,"156"],
|
||||
@@ -570,6 +563,7 @@ export const CI230X_BROADCAST = {
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_UNIT)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE,"None"],
|
||||
[Blockly.Msg.MIXLY_YEAR,"117"],
|
||||
[Blockly.Msg.MIXLY_MONTH,"118"],
|
||||
[Blockly.Msg.MIXLY_DAY,"119"],
|
||||
@@ -614,6 +608,31 @@ export const CI230X_BROADCAST = {
|
||||
}
|
||||
}
|
||||
|
||||
export const CI130X_SET_SYSTEM_CMD = {
|
||||
init:function(){
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
this.appendValueInput('SUB')
|
||||
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr+'CI130X')
|
||||
.setCheck("var");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.LISTS_SET_INDEX_SET + Blockly.Msg.MIXLY_SYSTEM + Blockly.Msg.MIXLY_CMD)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_HELLO_XIAOZHI,"1"],
|
||||
[Blockly.Msg.MIXLY_XIAOZHIXIAOZHI,"2"],
|
||||
[Blockly.Msg.MIXLY_INCREASE_VOLUME,"202"],
|
||||
[Blockly.Msg.MIXLY_REDUCE_VOLUME,"203"],
|
||||
[Blockly.Msg.MIXLY_MAX_VOLUME,"204"],
|
||||
[Blockly.Msg.MIXLY_MINIMUM,"205"],
|
||||
[Blockly.Msg.MIXLY_OPEN_RESPONSE,"206"],
|
||||
[Blockly.Msg.MIXLY_CLOSE_RESPONSE,"207"],
|
||||
[Blockly.Msg.MIXLY_QUIT,"208"]
|
||||
]),"cmd")
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_MAX30102_extern = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_EXTERN_HUE);
|
||||
|
||||
@@ -215,9 +215,9 @@ export const sensor_use_i2c_init = function (_, generator) {
|
||||
}else if (key == 'CBR817') {
|
||||
generator.definitions_['import_cbr817'] = 'import cbr817';
|
||||
code = v + ' = cbr817.' + key + "(" + iv + ')\n';
|
||||
}else if (key == 'CI230X'){
|
||||
generator.definitions_['import_ci230x'] = 'import ci230x';
|
||||
code = v + ' = ci230x.' + key + "(" + iv + ')\n';
|
||||
}else if (key == 'CI130X'){
|
||||
generator.definitions_['import_ci130x'] = 'import ci130x';
|
||||
code = v + ' = ci130x.' + key + "(" + iv + ')\n';
|
||||
}
|
||||
return code;
|
||||
}
|
||||
@@ -238,42 +238,50 @@ export const interaction_whether_to_interaction = function(_,generator){
|
||||
return [code,generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const CI230X_IDENTIFY_AND_SAVE = function(_,generator){
|
||||
generator.definitions_['import_ci230x'] = 'import ci230x';
|
||||
export const CI130X_IDENTIFY_AND_SAVE = function(_,generator){
|
||||
generator.definitions_['import_ci130x'] = 'import ci130x';
|
||||
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
var code = sub+'.cmd_id()';
|
||||
var code = sub+'.cmd_id()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const CI230X_GET_WHETHER_IDENTIFY = function(_,generator){
|
||||
generator.definitions_['import_ci230x'] = 'import ci230x';
|
||||
export const CI130X_GET_WHETHER_IDENTIFY = function(_,generator){
|
||||
generator.definitions_['import_ci130x'] = 'import ci130x';
|
||||
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
var cmd = this.getFieldValue('cmd');
|
||||
var code = sub+'.result('+cmd+')';
|
||||
return [code,generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const MIXLY_GET_THE_RECOGNIZED_CMD = function(_,generator){
|
||||
generator.definitions_['import_ci230x'] = 'import ci230x';
|
||||
export const CI130X_GET_THE_RECOGNIZED_CMD = function(_,generator){
|
||||
generator.definitions_['import_ci130x'] = 'import ci130x';
|
||||
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
var code = sub+'.result()';
|
||||
var key = this.getFieldValue('key');
|
||||
if(key == 'status1'){
|
||||
var code = sub+'.status()[0]';
|
||||
}else if(key == 'status2'){
|
||||
var code = sub+'.status()[1]';
|
||||
}else{
|
||||
var code = sub+'.'+key +'()';
|
||||
}
|
||||
return [code,generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const CI230X_GET_THE_RECOGNIZED_STATE = function(_,generator){
|
||||
generator.definitions_['import_ci230x'] = 'import ci230x';
|
||||
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
var code = sub+'.status()';
|
||||
return [code,generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const CI230X_BROADCAST = function(_,generator){
|
||||
generator.definitions_['import_ci230x'] = 'import ci230x';
|
||||
export const CI130X_BROADCAST = function(_,generator){
|
||||
generator.definitions_['import_ci130x'] = 'import ci130x';
|
||||
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
|
||||
var star = this.getFieldValue('star');
|
||||
var end = this.getFieldValue('end');
|
||||
var code = sub+'.play('+star+','+num+','+end+')';
|
||||
var code = sub+'.play('+star+','+num+','+end+')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const CI130X_SET_SYSTEM_CMD = function(_,generator){
|
||||
generator.definitions_['import_ci130x'] = 'import ci130x';
|
||||
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
var cmd = this.getFieldValue('cmd');
|
||||
var code = sub+'.sys_cmd('+cmd+')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
|
||||
@@ -3846,45 +3846,42 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_IDENTIFY_AND_SAVE">
|
||||
<block type="CI130X_IDENTIFY_AND_SAVE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_WHETHER_IDENTIFY">
|
||||
<block type="CI130X_GET_WHETHER_IDENTIFY">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_CMD">
|
||||
<block type="CI130X_GET_THE_RECOGNIZED_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_STATE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_BROADCAST">
|
||||
<block type="CI130X_BROADCAST">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="NUM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
<block type="logic_null"></block>
|
||||
</value>
|
||||
</block>
|
||||
<block type = "CI130X_SET_SYSTEM_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</block>
|
||||
<block type="communicate_spi_init">
|
||||
<value name="VAR">
|
||||
|
||||
@@ -3691,46 +3691,43 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_IDENTIFY_AND_SAVE">
|
||||
<block type="CI130X_IDENTIFY_AND_SAVE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_WHETHER_IDENTIFY">
|
||||
<block type="CI130X_GET_WHETHER_IDENTIFY">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_CMD">
|
||||
<block type="CI130X_GET_THE_RECOGNIZED_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_STATE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_BROADCAST">
|
||||
<block type="CI130X_BROADCAST">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="NUM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
<block type="logic_null"></block>
|
||||
</value>
|
||||
</block>
|
||||
</block>
|
||||
<block type = "CI130X_SET_SYSTEM_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</block>
|
||||
<block type="communicate_spi_init" m-hide='micropython:esp32c3:mixgocar_c3'>
|
||||
<value name="VAR">
|
||||
<shadow type="variables_get">
|
||||
|
||||
@@ -3643,45 +3643,42 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_IDENTIFY_AND_SAVE">
|
||||
<block type="CI130X_IDENTIFY_AND_SAVE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_WHETHER_IDENTIFY">
|
||||
<block type="CI130X_GET_WHETHER_IDENTIFY">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_CMD">
|
||||
<block type="CI130X_GET_THE_RECOGNIZED_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_STATE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_BROADCAST">
|
||||
<block type="CI130X_BROADCAST">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="NUM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
<block type="logic_null"></block>
|
||||
</value>
|
||||
</block>
|
||||
<block type = "CI130X_SET_SYSTEM_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</block>
|
||||
<block type="communicate_spi_init" m-hide='micropython:esp32c3:mixgocar_c3'>
|
||||
<value name="VAR">
|
||||
|
||||
@@ -3439,45 +3439,42 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_IDENTIFY_AND_SAVE">
|
||||
<block type="CI130X_IDENTIFY_AND_SAVE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_WHETHER_IDENTIFY">
|
||||
<block type="CI130X_GET_WHETHER_IDENTIFY">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_CMD">
|
||||
<block type="CI130X_GET_THE_RECOGNIZED_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_STATE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_BROADCAST">
|
||||
<block type="CI130X_BROADCAST">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="NUM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
<block type="logic_null"></block>
|
||||
</value>
|
||||
</block>
|
||||
<block type = "CI130X_SET_SYSTEM_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</block>
|
||||
<block type="communicate_spi_init">
|
||||
<value name="VAR">
|
||||
|
||||
@@ -4078,45 +4078,42 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_IDENTIFY_AND_SAVE">
|
||||
<block type="CI130X_IDENTIFY_AND_SAVE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_WHETHER_IDENTIFY">
|
||||
<block type="CI130X_GET_WHETHER_IDENTIFY">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_CMD">
|
||||
<block type="CI130X_GET_THE_RECOGNIZED_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_GET_THE_RECOGNIZED_STATE">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="CI230X_BROADCAST">
|
||||
<block type="CI130X_BROADCAST">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="NUM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
<block type="logic_null"></block>
|
||||
</value>
|
||||
</block>
|
||||
<block type = "CI130X_SET_SYSTEM_CMD">
|
||||
<value name="SUB">
|
||||
<shadow type="variables_get">
|
||||
<field name="VAR">xsensor</field>
|
||||
</shadow>
|
||||
</block>
|
||||
<block type="communicate_spi_init">
|
||||
<value name="VAR">
|
||||
|
||||
Reference in New Issue
Block a user