diff --git a/lib/lifecycle.js b/lib/lifecycle.js index 4443324b..9bdb0176 100644 --- a/lib/lifecycle.js +++ b/lib/lifecycle.js @@ -600,6 +600,15 @@ class LifecycleNode extends Node { return rclnodejs.isInitialized(this._stateMachineHandle); } + /** + * Log the state machine data. + * + * @returns {undefined} void. + */ + print() { + rclnodejs.print(this._stateMachineHandle); + } + /** * The GetState service handler. * @param {Object} request - The GetState service request. diff --git a/src/rcl_lifecycle_bindings.cpp b/src/rcl_lifecycle_bindings.cpp index 898c6ef9..702aaf28 100644 --- a/src/rcl_lifecycle_bindings.cpp +++ b/src/rcl_lifecycle_bindings.cpp @@ -372,6 +372,17 @@ Napi::Value IsInitialized(const Napi::CallbackInfo& info) { return Napi::Boolean::New(env, is_initialized); } +Napi::Value Print(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + RclHandle* state_machine_handle = + RclHandle::Unwrap(info[0].As()); + rcl_lifecycle_state_machine_t* state_machine = + reinterpret_cast( + state_machine_handle->ptr()); + rcl_print_state_machine(state_machine); + return env.Undefined(); +} + Napi::Object InitLifecycleBindings(Napi::Env env, Napi::Object exports) { exports.Set("createLifecycleStateMachine", Napi::Function::New(env, CreateLifecycleStateMachine)); @@ -396,6 +407,7 @@ Napi::Object InitLifecycleBindings(Napi::Env env, Napi::Object exports) { exports.Set("getLifecycleShutdownTransitionLabel", Napi::Function::New(env, GetLifecycleShutdownTransitionLabel)); exports.Set("isInitialized", Napi::Function::New(env, IsInitialized)); + exports.Set("print", Napi::Function::New(env, Print)); return exports; } diff --git a/test/test-lifecycle.js b/test/test-lifecycle.js index 12ff9bcb..b628ad3d 100644 --- a/test/test-lifecycle.js +++ b/test/test-lifecycle.js @@ -356,4 +356,10 @@ describe('LifecycleNode test suite', function () { assert.equal(serviceMsgs.length, 0, 'Unexpected lifecycle services found'); testNode.destroy(); }); + + it('lifecycleNode initial state', function () { + assert.doesNotThrow(() => { + node.print(); + }); + }); }); diff --git a/test/types/index.test-d.ts b/test/types/index.test-d.ts index 69ef573e..ee81cb6e 100644 --- a/test/types/index.test-d.ts +++ b/test/types/index.test-d.ts @@ -127,6 +127,7 @@ expectType(lifecycleNode.deactivate()); expectType(lifecycleNode.cleanup()); expectType(lifecycleNode.shutdown()); expectType(lifecycleNode.isInitialized); +expectType(lifecycleNode.print()); // ---- Publisher ---- const publisher = node.createPublisher(TYPE_CLASS, TOPIC); diff --git a/types/lifecycle.d.ts b/types/lifecycle.d.ts index 8dcc8589..fea778b9 100644 --- a/types/lifecycle.d.ts +++ b/types/lifecycle.d.ts @@ -333,6 +333,13 @@ declare module 'rclnodejs' { * @returns {boolean} true if the state machine is initialized; otherwise false. */ get isInitialized(): boolean; + + /** + * Log the state machine data. + * + * @returns {undefined} void. + */ + print(): void; } } // lifecycle namespace } // rclnodejs namespace