Skip to content

Commit 3879228

Browse files
committed
wip #65
1 parent 27c1fdd commit 3879228

File tree

5 files changed

+109
-7
lines changed

5 files changed

+109
-7
lines changed

event.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,21 @@ def get_instance(cls, node_name=None):
1212
return cls._instance
1313

1414
def __init__(self, node_name):
15+
self._node_name = node_name
1516
rospy.init_node(node_name)
1617
self._publishers = {}
1718
self._event_generators = []
19+
self._event_listeners = []
1820

19-
def register_publisher(self, topic):
20-
publisher = rospy.Publisher("/" + node_name + "/" + topic, String, queue_size=10)
21-
self._publishers[topic] = publisher
21+
def get_publisher(self, topic):
22+
publisher = self._publishers.get(topic)
23+
if publisher is None:
24+
publisher = rospy.Publisher("/" + self._node_name + "/" + topic, std_msgs.msg.String, queue_size=10)
25+
self._publishers[topic] = publisher
2226
return publisher
2327

24-
def register_listener(self, topic, callback):
25-
rospy.Subscriber("/" + node_name + "/" + topic, std_msgs.msg.String, callback)
28+
def register_event_listener(self, topic, callback):
29+
self._event_listeners.append(rospy.Subscriber("/" + self._node_name + "/" + topic, std_msgs.msg.String, callback))
2630

2731
def register_event_generator(self, generator_func):
2832
generator = threading.Thread(target=generator_func)

event_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
def event_generator_1():
2+
while True:
3+
get_prog_eng().check_end()
4+
c = get_cam().find_class()
5+
if c != "o":
6+
get_event().get_publisher("image/classified").publish(c)
7+
print "pub event: " + c
8+
get_event().register_event_generator(event_generator_1)
9+
10+
def event_listener_1(event):
11+
get_cam().set_text(event)
12+
print event
13+
get_event().register_event_listener("image/classified", event_listener_1)
14+
15+
while True:
16+
get_prog_eng().check_end()
17+
get_cam().sleep(0.1)

program.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def run(self):
152152
logging.debug("starting video")
153153
except:
154154
logging.error("Camera not available")
155-
155+
156156
exec(self._code)
157157
except RuntimeError as re:
158158
logging.info("quit: " + str(re))
@@ -164,7 +164,7 @@ def run(self):
164164
logging.error("Camera not available")
165165
self._running = False
166166

167-
get_event_manager().wait_event_generators()
167+
get_event().wait_event_generators()
168168

169169
def as_json(self):
170170
return {'name': self.name,

static/js/blockly/blocks.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,82 @@ Blockly.Python['coderbot_adv_cnn_classify'] = function(block) {
737737
return [class_scores, Blockly.Python.ORDER_ATOMIC];
738738
};
739739

740+
741+
Blockly.Blocks['coderbot_event_generator'] = {
742+
init: function() {
743+
this.appendStatementInput("event_generator_function")
744+
.appendField("event generator")
745+
.setCheck(null);
746+
this.setColour(15);
747+
this.setTooltip("event generator");
748+
this.setHelpUrl("");
749+
}
750+
};
751+
752+
var coderbot_generator_id = 1;
753+
Blockly.Python['coderbot_event_generator'] = function(block) {
754+
Blockly.Generator.prototype.INDENT = ' ';
755+
var statements_event_generator = Blockly.Python.statementToCode(block, 'event_generator_function');
756+
Blockly.Generator.prototype.INDENT = ' ';
757+
// TODO: Assemble Python into code variable.
758+
var code = 'def event_generator_' + coderbot_generator_id + '():\n' +
759+
' while True:\n' +
760+
' get_prog_eng().check_end()\n' +
761+
statements_event_generator + '\n' +
762+
'get_event().register_event_generator(event_generator_' + coderbot_generator_id + ')'
763+
coderbot_generator_id++;
764+
return code;
765+
};
766+
767+
Blockly.Blocks['coderbot_event_listener'] = {
768+
init: function() {
769+
this.appendDummyInput()
770+
.appendField("event listener for: ")
771+
.appendField(new Blockly.FieldDropdown([["image/classified","image/classified"], ["image/face_detected","image/face_detected"], ["sonar/obstacle","sonar/obstacle"]]), "event_topic");
772+
this.appendStatementInput("event_listener_code")
773+
.setCheck(null);
774+
this.setColour(15);
775+
this.setTooltip("event listener");
776+
this.setHelpUrl("");
777+
}
778+
};
779+
780+
var coderbot_listener_id = 1;
781+
Blockly.Python['coderbot_event_listener'] = function(block) {
782+
var event_topic = block.getFieldValue('event_topic');
783+
var statements_event_listener = Blockly.Python.statementToCode(block, 'event_listener_code');
784+
// TODO: Assemble Python into code variable.
785+
var code = 'def event_listener_' + coderbot_listener_id + '(event_data):\n' +
786+
statements_event_listener + '\n' +
787+
'get_event().register_event_listener(\'' + event_topic + '\', event_listener_' + coderbot_listener_id + ')'
788+
coderbot_listener_id++;
789+
return code;
790+
};
791+
792+
Blockly.Blocks['coderbot_event_publisher'] = {
793+
init: function() {
794+
this.appendDummyInput()
795+
.appendField("publish event on topic:")
796+
.appendField(new Blockly.FieldTextInput("event_topic"), "event_topic");
797+
this.appendValueInput("event_data")
798+
.setCheck(null)
799+
.appendField("data:");
800+
this.setInputsInline(true);
801+
this.setPreviousStatement(true, null);
802+
this.setNextStatement(true, null);
803+
this.setColour(15);
804+
this.setTooltip("event publisher");
805+
this.setHelpUrl("");
806+
}
807+
};
808+
809+
Blockly.Python['coderbot_event_publisher'] = function(block) {
810+
var event_topic = block.getFieldValue('event_topic');
811+
var event_data = Blockly.Python.valueToCode(block, 'event_data', Blockly.Python.ORDER_ATOMIC);
812+
var code = 'get_event().get_publisher(\'' + event_topic + '\').publish(' + event_data + ')';
813+
return code;
814+
};
815+
740816
Blockly.Blocks['coderbot_audio_record'] = {
741817
/**
742818
* Block for findLogo function.

templates/blocks_adv.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@
169169
</category>
170170
<category name="{% trans %}Variables{% endtrans %}" custom="VARIABLE" colour="330"></category>
171171
<category name="{% trans %}Functions{% endtrans %}" custom="PROCEDURE" colour="290"></category>
172+
<category name="{% trans %}Event{% endtrans %}" colour="40">
173+
<block type="coderbot_event_generator"></block>
174+
<block type="coderbot_event_publisher"></block>
175+
<block type="coderbot_event_listener"></block>
176+
</category>
172177
<category name="{% trans %}Movement{% endtrans %}" colour="40">
173178
<block type="coderbot_moveForward"></block>
174179
<block type="coderbot_moveBackward"></block>

0 commit comments

Comments
 (0)