Beispiel #1
0
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"
Beispiel #2
0
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)
Beispiel #3
0
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'")
Beispiel #5
0
 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'))))
Beispiel #6
0
 def __init__(self, node) -> None:
     Process.__init__(self, node)
     self._node = node
     self._node.register_name(self, Atom('pyBridge'))  # optional
     print("registering process - 'pyBridge'")
Beispiel #7
0
 def sendTest(self):
     self._node.send(sender=self.pid_,
                     receiver=(Atom('erl@rpi3'), Atom('erlBridge')),
                     message=(self.pid_, (Atom('acc'), (42, 43, 44))))
Beispiel #8
0
 def sendString(self, topic, data):
     self._node.send(sender=self.pid_,
                     receiver=(Atom('erl@rpi3'), Atom('erlBridge')),
                     message=(self.pid_, (Atom('push'), topic, data)))
Beispiel #9
0
    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"))