package Ġorg . lf lang . generator . cpp Ċ Ċ import Ġorg . lf lang . Target Config Ċ import Ġorg . lf lang . lf . Reactor Ċ import Ġorg . lf lang . to Unix String Ċ Ċ /** ĠA ĠC ++ Ġcode Ġgenerator Ġfor Ġcreating Ġa ĠROS 2 Ġnode Ġfrom Ġa Ġmain Ġreactor Ġdefinition Ġ*/ Ċ class ĠCpp Ros 2 Node Generator ( ĊĠĠĠ Ġprivate Ġval Ġmain : ĠRe actor , ĊĠĠĠ Ġprivate Ġval Ġtarget Config : ĠTarget Config , ĊĠĠĠ Ġprivate Ġval Ġfile Config : ĠCpp File Config Ċ ) Ġ{ ĊĊĠĠĠ Ġval ĠnodeName Ġ= Ġ"${ file Config . name } Node " ĊĊĠĠĠ Ġfun Ġgenerate Header (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # pragma Ġonce ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ< r cl cpp / r cl cpp . hpp > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ" reactor - cpp / reactor - cpp . hh " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ" lf _ timeout . hh " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ"${ file Config . get Reactor Header Path ( main ). to Unix String () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| r cl cpp :: Node * Ġlf _ node { nullptr }; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| class Ġ$ nodeName Ġ: Ġpublic Ġrcl cpp :: Node Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| private : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġstd :: unique _ ptr < reactor :: Environment > Ġlf _ env ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġstd :: unique _ ptr < ${ main . name }> Ġlf _ main _ reactor ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġstd :: unique _ ptr < __ lf _ Timeout > Ġlf _ timeout _ reactor ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġmain Ġthread Ġof Ġthe ĠL F Ġexecution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġstd :: thread Ġlf _ main _ thread ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġan Ġadditional Ġthread Ġthat Ġwe Ġuse Ġfor Ġwaiting Ġfor ĠL F Ġtermination ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġand Ġthen Ġshut ting Ġdown Ġthe ĠL F Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġstd :: thread Ġlf _ shutdown _ thread ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġvoid Ġwait _ for _ lf _ shutdown (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| public : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ$ nodeName ( const Ġrcl cpp :: Node Options & Ġnode _ options ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ~ $ nodeName (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| }; ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Source (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ"$ nodeName . hh " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ< r cl cpp _ components / register _ node _ macro . hpp > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| # include Ġ< thread > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| void Ġ$ nodeName :: wait _ for _ lf _ shutdown () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ main _ thread . join (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġthis -> get _ node _ options (). context ()-> shutdown (" LF Ġexecution Ġterminated "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ nodeName ::$ nodeName ( const Ġrcl cpp :: Node Options & Ġnode _ options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ: ĠNode ("$ nodeName ", Ġnode _ options ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġunsigned Ġworkers Ġ= Ġ${ if Ġ( target Config . workers Ġ!= Ġ 0 ) Ġtarget Config . workers Ġelse Ġ" std :: thread :: hardware _ concurrency () "}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġbool Ġfast { ${ target Config . fast Mode }}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġbool Ġkeep alive { ${ target Config . keep alive }}; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġreactor :: Duration Ġlf _ timeout { ${ target Config . timeout ?. to Cpp Code () Ġ?: Ġ" reactor :: Duration :: zero () "} }; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġprovide Ġa Ġglobally Ġaccessible Ġreference Ġto Ġthis Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// ĠFIXME : Ġthis Ġis Ġpretty Ġhack y ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ node Ġ= Ġthis ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ env Ġ= Ġstd :: make _ unique < reactor :: Environment >( workers , Ġkeep alive , Ġfast ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġinstantiate Ġthe Ġmain Ġreactor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ main _ reactor Ġ= Ġstd :: make _ unique < ${ main . name }> Ġ(" ${ main . name }", Ġlf _ env . get ()); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġoptionally Ġinstantiate Ġthe Ġtimeout Ġreactor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġif Ġ( lf _ timeout Ġ!= Ġreactor :: Duration :: zero ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġlf _ timeout _ reactor Ġ= Ġstd :: make _ unique < __ lf _ Timeout >(" __ lf _ Timeout ", Ġlf _ env . get (), Ġlf _ timeout ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġassemble Ġreactor Ġprogram ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ env -> assemble (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ// Ġstart Ġexecution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ main _ thread Ġ= Ġlf _ env -> startup (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ shutdown _ thread Ġ= Ġstd :: thread ([ = ] Ġ{ Ġwait _ for _ lf _ shutdown (); Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ nodeName ::~ $ nodeName () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġif Ġ( lf _ env -> phase () Ġ== Ġreactor :: Environment :: Phase :: Execution ) Ġ{ ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġlf _ env -> async _ shutdown (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġlf _ shutdown _ thread . join (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| R CL CPP _ COMPONENTS _ REGISTER _ NODE ($ nodeName ) ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠ Ġ} Ċ } Ċ