Skip to content

Commit 6863d48

Browse files
committed
Setup repository to separate seahawk code.
0 parents  commit 6863d48

File tree

9 files changed

+216
-0
lines changed

9 files changed

+216
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
build

.gitmodules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[submodule "src/pico-sdk"]
2+
path = src/pico-sdk
3+
url = https://github.com/raspberrypi/pico-sdk.git
4+
[submodule "src/micro_ros_raspberrypi_pico_sdk"]
5+
path = src/micro_ros_raspberrypi_pico_sdk
6+
url = https://github.com/micro-ROS/micro_ros_raspberrypi_pico_sdk.git

.vscode/settings.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"cmake.configureEnvironment": {
3+
"PICO_SDK_PATH": "${workspaceFolder}/src/pico-sdk",
4+
"MICRO_ROS_RPI_PICO_PATH": "${workspaceFolder}/src/micro_ros_raspberrypi_pico_sdk",
5+
},
6+
"git.detectSubmodules": false,
7+
"cmake.sourceDirectory": "${workspaceFolder}/src/seahawk",
8+
}

src/micro_ros_raspberrypi_pico_sdk

src/pico-sdk

Submodule pico-sdk added at 6a7db34

src/seahawk/CMakeLists.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
cmake_minimum_required(VERSION 3.12)
2+
3+
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
4+
5+
project(seahawk C CXX ASM)
6+
set(CMAKE_C_STANDARD 11)
7+
set(CMAKE_CXX_STANDARD 17)
8+
9+
pico_sdk_init()
10+
11+
link_directories($ENV{MICRO_ROS_RPI_PICO_PATH}/libmicroros)
12+
13+
add_executable(seahawk
14+
seahawk.c
15+
pico_uart_transport.c
16+
)
17+
target_link_libraries(seahawk
18+
pico_stdlib
19+
microros
20+
)
21+
22+
target_include_directories(seahawk PUBLIC
23+
$ENV{MICRO_ROS_RPI_PICO_PATH}/libmicroros/include
24+
)
25+
26+
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
27+
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
28+
29+
# Configure Pico
30+
pico_enable_stdio_usb(seahawk 1)
31+
pico_enable_stdio_uart(seahawk 0)
32+
add_compile_definitions(PICO_UART_ENABLE_CRLF_SUPPORT=0)
33+
add_compile_definitions(PICO_STDIO_ENABLE_CRLF_SUPPORT=0)
34+
add_compile_definitions(PICO_STDIO_DEFAULT_CRLF=0)
35+
36+
# Generate UF2
37+
pico_add_extra_outputs(seahawk)

src/seahawk/pico_uart_transport.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#include <stdio.h>
2+
#include "pico/stdlib.h"
3+
4+
#include <uxr/client/profile/transport/custom/custom_transport.h>
5+
6+
void usleep(uint64_t us)
7+
{
8+
sleep_us(us);
9+
}
10+
11+
int clock_gettime(clockid_t unused, struct timespec *tp)
12+
{
13+
uint64_t m = time_us_64();
14+
tp->tv_sec = m / 1000000;
15+
tp->tv_nsec = (m % 1000000) * 1000;
16+
return 0;
17+
}
18+
19+
bool pico_serial_transport_open(struct uxrCustomTransport * transport)
20+
{
21+
stdio_init_all();
22+
return true;
23+
}
24+
25+
bool pico_serial_transport_close(struct uxrCustomTransport * transport)
26+
{
27+
return true;
28+
}
29+
30+
size_t pico_serial_transport_write(struct uxrCustomTransport * transport, uint8_t *buf, size_t len, uint8_t *errcode)
31+
{
32+
for (size_t i = 0; i < len; i++)
33+
{
34+
if (buf[i] != putchar(buf[i]))
35+
{
36+
*errcode = 1;
37+
return i;
38+
}
39+
}
40+
return len;
41+
}
42+
43+
size_t pico_serial_transport_read(struct uxrCustomTransport * transport, uint8_t *buf, size_t len, int timeout, uint8_t *errcode)
44+
{
45+
uint64_t start_time_us = time_us_64();
46+
for (size_t i = 0; i < len; i++)
47+
{
48+
int64_t elapsed_time_us = timeout * 1000 - (time_us_64() - start_time_us);
49+
if (elapsed_time_us < 0)
50+
{
51+
*errcode = 1;
52+
return i;
53+
}
54+
55+
int character = getchar_timeout_us(elapsed_time_us);
56+
if (character == PICO_ERROR_TIMEOUT)
57+
{
58+
*errcode = 1;
59+
return i;
60+
}
61+
buf[i] = character;
62+
}
63+
return len;
64+
}

src/seahawk/pico_uart_transports.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef MICRO_ROS_PICOSDK
2+
#define MICRO_ROS_PICOSDK
3+
4+
#include <stdio.h>
5+
#include <stdint.h>
6+
7+
#include <uxr/client/profile/transport/custom/custom_transport.h>
8+
9+
bool pico_serial_transport_open(struct uxrCustomTransport * transport);
10+
bool pico_serial_transport_close(struct uxrCustomTransport * transport);
11+
size_t pico_serial_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err);
12+
size_t pico_serial_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err);
13+
14+
#endif //MICRO_ROS_PICOSDK

src/seahawk/seahawk.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <stdio.h>
2+
3+
#include <rcl/rcl.h>
4+
#include <rcl/error_handling.h>
5+
#include <rclc/rclc.h>
6+
#include <rclc/executor.h>
7+
#include <std_msgs/msg/int32.h>
8+
#include <rmw_microros/rmw_microros.h>
9+
10+
#include "pico/stdlib.h"
11+
#include "pico_uart_transports.h"
12+
13+
const uint LED_PIN = 25;
14+
15+
rcl_publisher_t publisher;
16+
std_msgs__msg__Int32 msg;
17+
18+
void timer_callback(rcl_timer_t *timer, int64_t last_call_time)
19+
{
20+
rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL);
21+
msg.data++;
22+
}
23+
24+
int main()
25+
{
26+
rmw_uros_set_custom_transport(
27+
true,
28+
NULL,
29+
pico_serial_transport_open,
30+
pico_serial_transport_close,
31+
pico_serial_transport_write,
32+
pico_serial_transport_read
33+
);
34+
35+
gpio_init(LED_PIN);
36+
gpio_set_dir(LED_PIN, GPIO_OUT);
37+
38+
rcl_timer_t timer;
39+
rcl_node_t node;
40+
rcl_allocator_t allocator;
41+
rclc_support_t support;
42+
rclc_executor_t executor;
43+
44+
allocator = rcl_get_default_allocator();
45+
46+
// Wait for agent successful ping for 2 minutes.
47+
const int timeout_ms = 1000;
48+
const uint8_t attempts = 120;
49+
50+
rcl_ret_t ret = rmw_uros_ping_agent(timeout_ms, attempts);
51+
52+
if (ret != RCL_RET_OK)
53+
{
54+
// Unreachable agent, exiting program.
55+
return ret;
56+
}
57+
58+
rclc_support_init(&support, 0, NULL, &allocator);
59+
60+
rclc_node_init_default(&node, "pico_node", "", &support);
61+
rclc_publisher_init_default(
62+
&publisher,
63+
&node,
64+
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
65+
"pico_publisher");
66+
67+
rclc_timer_init_default(
68+
&timer,
69+
&support,
70+
RCL_MS_TO_NS(1000),
71+
timer_callback);
72+
73+
rclc_executor_init(&executor, &support.context, 1, &allocator);
74+
rclc_executor_add_timer(&executor, &timer);
75+
76+
gpio_put(LED_PIN, 1);
77+
78+
msg.data = 0;
79+
while (true)
80+
{
81+
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
82+
}
83+
return 0;
84+
}

0 commit comments

Comments
 (0)