Yep, I have done it. It has taken a little time, but I am now in the final steps to finish a new engine to develop interactive components. This can be used to create workflow systems or user interfaces.
The UI subsystem I created for my simple sensor application was not capable to handle the complexity and flexibility required to implement a multi-dimensional layout engine.
I struggeled around a few days with the layout engine based on the old UI subsystem, but then decided to revamp the subsystem completely to create a new – more Pi-Calculus based – system, where the connection ports are copyable and channels between ports are created on demand.
There were several issues to be solved. First of all, the lifetime of the objects and the separation of the receiving dispatchers of the bound ports were a major problem. I encountered a simple but effective solution: Each active object needs to instantiate a Process object, to which all dispatchers are bound. So the lifetime of the dispatchers is bound to the object’s lifetime.
Then there were special kinds of ports, ports itsself are only message ports. But most of the time I’d like to see ports as a value port, which has an initial value and is distributing the value only in the case of a change. So I introduced an extended port with additional capabilities: the record. A record always needs an initial value and distributes only changes to clients. Clients can be either records again or ports. Additionally to a message receiving member function, records support a direct connection to a member function without any parameters.
The new subsystem even supports an n:n distribution of messages and record values.
There are several optimizations pending, but basically the system works and I am up to finally connect the components of the layouting system.
I started with a little research in workflow engines, Pi-Calculus and realtime systems and it ended up with a complete new way to implement software. I am having a little trouble to finally feel and create the components. It is now about connecting ports the right way and not about derivation and mathod calling. And the real fun has not even started. The ports in the new engine are copyable, so object graphs may reconnect dynamically, even across network boundaries. Thank you Robert Milner for giving me so much inspiration!
So what else is new. Well, there is a lot going on on the IT market, many of my colleagues are reporting a large interest for IT geeks here in Germany. Even I got some offers these days!
My next steps are to finally finish the new UI subsystem, the layouting engine so that I can move forward. After that, I will complete the GPL release of Libsmart and then I need to complete some paid jobs to earn some money. But I will stay focused on the Paramatrix project.
Happy connecting ports!
BTW: There are several reincarnations of models supporting a terminology similar to the Pi-Calculus, notable are ROOM and Realtime UML. But I have seen no one usable directly from within C++. The only implementation I have seen was for Haskell.