def start_stop_with(ev_engine: BaseEngine, py_node_name: str): """ Starts the local node node, tries to connect to an externally started Erlang node, then stops the local node. Checks whether reference to it died (whether GC was able to claim it). TODO: It doesn't always claim it. Probably not a bug? """ node = Node(node_name=py_node_name + "@127.0.0.1", cookie="COOKIE", engine=ev_engine) fake_pid = node.register_new_process() node.send(sender=fake_pid, receiver=(Atom('[email protected]'), Atom('shell')), message=Atom('hello')) ev_engine.sleep(3) import weakref import gc wref = weakref.ref(node) node.destroy() del node gc.collect() assert wref() is None, "Reference to node must be dead at this point"
def main(): node = Pyrlang.Node("[email protected]", "COOKIE") node.start() pid = node.register_new_process(None) node.send(pid, (Atom('[email protected]'), Atom('shell')), Atom('hello')) while True: # Sleep gives other greenlets time to run gevent.sleep(0.1)
def main(): node = Node("[email protected]", "COOKIE") node.start() # Attempt to send something will initiate a connection before sending pid = node.register_new_process(None) # To be able to send to Erlang shell by name first give it a registered # name: `erlang:register(shell, self()).` node.send(pid, (Atom('[email protected]'), Atom('shell')), Atom('hello')) while True: # Sleep gives other greenlets time to run gevent.sleep(0.1)
def __init__(self, node) -> None: Process.__init__(self, node) node.register_name(self, Atom('my_process')) # optional print("registering process - 'my_process'")
def handle_one_inbox_message(self, msg): global registeredPublishers #print("Incoming", msg) remotePid = msg[0] action = msg[1] if action == Atom('stop'): exit(0) msgType = msg[2] topic = msg[3] if action == Atom('subscribe'): if topic + "__" + str(msgType) in registeredListeners.keys(): print("already listening to topic " + topic) self._node.send(sender=self.pid_, receiver=remotePid, message=(self.pid_, (Atom('err'), Atom('already_subscribed')))) else: print("subscribing to " + topic) if msgType == Atom('string'): sub = rospy.Subscriber(topic, String, callback, topic) elif msgType == Atom('int16'): sub = rospy.Subscriber(topic, Int16, callback, topic) elif msgType == Atom('vector3'): sub = rospy.Subscriber(topic, Vector3, callback_vector3, topic) else: self._node.send(sender=self.pid_, receiver=remotePid, message=(self.pid_, (Atom('err'), Atom('unknown_message_type'), msgType))) return registeredListeners[topic + "__" + str(msgType)] = sub #print(self.pid_) #print(remotePid) self._node.send(sender=self.pid_, receiver=remotePid, message=(self.pid_, (Atom('ok'), topic))) elif action == Atom('publish'): data = msg[4] if not topic in registeredPublishers.keys(): if msgType == Atom('string'): registeredPublishers[topic] = rospy.Publisher(topic, String, queue_size=0) rospy.sleep(.1) if msgType == Atom('int16'): registeredPublishers[topic] = rospy.Publisher(topic, Int16, queue_size=0) rospy.sleep(.1) if msgType == Atom('float32'): registeredPublishers[topic] = rospy.Publisher(topic, Float32, queue_size=0) rospy.sleep(0.1) if msgType == Atom('bool'): registeredPublishers[topic] = rospy.Publisher(topic, Bool, queue_size=0) rospy.sleep(.1) if msgType == Atom('string'): registeredPublishers[topic].publish(String(data)) elif msgType == Atom('int16'): registeredPublishers[topic].publish(Int16(data)) elif msgType == Atom('float32'): registeredPublishers[topic].publish(Float32(data)) elif msgType == Atom('bool'): registeredPublishers[topic].publish(Bool(data)) else: self._node.send(sender=self.pid_, receiver=remotePid, message=(self.pid_, (Atom('err'), Atom('unknown_message_type'), msgType))) return self._node.send(sender=self.pid_, receiver=remotePid, message=(self.pid_, (Atom('ok'), topic))) else: self._node.send(sender=self.pid_, receiver=remotePid, message=(self.pid_, (Atom('err'), Atom('invalid_request'))))
def __init__(self, node) -> None: Process.__init__(self, node) self._node = node self._node.register_name(self, Atom('pyBridge')) # optional print("registering process - 'pyBridge'")
def sendTest(self): self._node.send(sender=self.pid_, receiver=(Atom('erl@rpi3'), Atom('erlBridge')), message=(self.pid_, (Atom('acc'), (42, 43, 44))))
def sendString(self, topic, data): self._node.send(sender=self.pid_, receiver=(Atom('erl@rpi3'), Atom('erlBridge')), message=(self.pid_, (Atom('push'), topic, data)))
def test_notebook_call(self): from Pyrlang.Notebook import Notebook nb = Notebook(options={}, node_name=self.node_name_) # Try calling with different styles of path _, value1 = nb.nb_call({ Atom("path"): ["datetime", "datetime", "now"], Atom("args"): [], Atom("kwargs"): {}, Atom("immediate"): True }) _, _, index2 = nb.nb_call({ Atom("path"): ["datetime", "datetime", "now"], Atom("args"): [], Atom("kwargs"): {}, Atom("immediate"): False }) print(nb.nb_retrieve(index2)) sleep(0.5) _, _, index3 = nb.nb_call({ Atom("path"): [b"datetime", Atom("datetime"), b"now"], Atom("args"): [], Atom("kwargs"): {}, Atom("immediate"): False }) # Substitute $pyrlangval for first element of path, and for argument _, diff4 = nb.nb_call({ Atom("path"): [(Atom("$pyrlangval"), index3), "__sub__"], Atom("args"): [(Atom("$pyrlangval"), index2)], Atom("kwargs"): {}, Atom("immediate"): True }) print("diff ", diff4) nb.exit(Atom("normal"))