1+ // This file is part of the CircuitPython project: https://circuitpython.org
2+ //
3+ // SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland for Adafruit Industries
4+ //
5+ // SPDX-License-Identifier: MIT
6+
7+ #include "shared-bindings/rclcpy/__init__.h"
8+
9+ rclcpy_context_t rclcpy_default_context = {
10+ .initialized = false,
11+ };
12+
13+ static void * microros_allocate (size_t size , void * state ) {
14+ (void ) state ;
15+ return m_malloc (size );
16+ }
17+
18+ static void microros_deallocate (void * pointer , void * state ) {
19+ (void ) state ;
20+ m_free (pointer );
21+ }
22+
23+ static void * microros_reallocate (void * pointer , size_t size , void * state ) {
24+ (void ) state ;
25+ return m_realloc (pointer , size );
26+ }
27+
28+ static void * microros_zero_allocate (size_t number_of_elements , size_t size_of_element , void * state ) {
29+ (void ) state ;
30+ size_t total_size = number_of_elements * size_of_element ;
31+ void * ptr = m_malloc (total_size );
32+ if (ptr != NULL ) {
33+ memset (ptr , 0 , total_size );
34+ }
35+ return ptr ;
36+ }
37+
38+ void common_hal_rclcpy_init (void ) {
39+ // Get empty allocator
40+ rcl_allocator_t custom_allocator = rcutils_get_zero_initialized_allocator ();
41+
42+ // Set custom allocation methods
43+ custom_allocator .allocate = microros_allocate ;
44+ custom_allocator .deallocate = microros_deallocate ;
45+ custom_allocator .reallocate = microros_reallocate ;
46+ custom_allocator .zero_allocate = microros_zero_allocate ;
47+
48+ // Set custom allocator as default
49+ if (!rcutils_set_default_allocator (& custom_allocator )) {
50+ mp_raise_RuntimeError (MP_ERROR_TEXT ("ROS memory allocator failure" ));
51+ }
52+
53+ rclcpy_default_context .rcl_allocator = custom_allocator ;
54+ rcl_ret_t ret ;
55+ ret = rclc_support_init (& rclcpy_default_context .rcl_support , 0 , NULL , & rclcpy_default_context .rcl_allocator );
56+ if (ret != RCL_RET_OK ) {
57+ mp_raise_RuntimeError (MP_ERROR_TEXT ("ROS failed to initialize" ));
58+ } else {
59+ rclcpy_default_context .initialized = true;
60+ }
61+ }
62+
63+ rclcpy_context_t * common_hal_rclcpy_get_default_context (void ) {
64+ return & rclcpy_default_context ;
65+ }
66+
67+ bool common_hal_rclcpy_default_context_is_initialized (void ) {
68+ return rclcpy_default_context .initialized ;
69+ }
0 commit comments