# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

load("@bazel_skylib//rules:run_binary.bzl", "run_binary")
load(
    "//pw_build:pigweed.bzl",
    "pw_cc_test",
)

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

cc_library(
    name = "id",
    hdrs = [
        "id_public_overrides/pw_thread_backend/id_inline.h",
        "id_public_overrides/pw_thread_backend/id_native.h",
        "public/pw_thread_freertos/id_inline.h",
        "public/pw_thread_freertos/id_native.h",
    ],
    includes = [
        "id_public_overrides",
        "public",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        "//pw_interrupt:context",
        "//pw_thread:id.facade",
        "@freertos",
    ],
)

cc_library(
    name = "sleep",
    srcs = [
        "sleep.cc",
    ],
    hdrs = [
        "public/pw_thread_freertos/sleep_inline.h",
        "sleep_public_overrides/pw_thread_backend/sleep_inline.h",
    ],
    includes = [
        "public",
        "sleep_public_overrides",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        "//pw_assert",
        "//pw_chrono:system_clock",
        "//pw_thread:id",
        "//pw_thread:sleep.facade",
        "@freertos",
    ],
)

cc_library(
    name = "thread",
    srcs = [
        "thread.cc",
    ],
    hdrs = [
        "public/pw_thread_freertos/config.h",
        "public/pw_thread_freertos/context.h",
        "public/pw_thread_freertos/options.h",
        "public/pw_thread_freertos/thread_inline.h",
        "public/pw_thread_freertos/thread_native.h",
        "thread_public_overrides/pw_thread_backend/thread_inline.h",
        "thread_public_overrides/pw_thread_backend/thread_native.h",
    ],
    includes = [
        "public",
        "thread_public_overrides",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        ":config_override",
        ":id",
        "//pw_assert",
        "//pw_string",
        "//pw_sync:binary_semaphore",
        "//pw_thread:deprecated_or_new_thread_function",
        "//pw_thread:thread.facade",
    ],
)

label_flag(
    name = "config_override",
    build_setting_default = "//pw_build:default_module_config",
)

cc_library(
    name = "dynamic_test_threads",
    srcs = [
        "dynamic_test_threads.cc",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        "//pw_chrono:system_clock",
        "//pw_thread:non_portable_test_thread_options",
        "//pw_thread:sleep",
        "//pw_thread:thread.facade",
    ],
)

pw_cc_test(
    name = "dynamic_thread_backend_test",
    # TODO: b/271465588 - Get this test to build.
    tags = ["manual"],
    deps = [
        ":dynamic_test_threads",
        "//pw_thread:thread_facade_test",
    ],
)

cc_library(
    name = "static_test_threads",
    srcs = [
        "static_test_threads.cc",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        "//pw_chrono:system_clock",
        "//pw_thread:non_portable_test_thread_options",
        "//pw_thread:sleep",
        "//pw_thread:thread.facade",
    ],
)

pw_cc_test(
    name = "static_thread_backend_test",
    # TODO: b/271465588 - Get this test to build.
    tags = ["manual"],
    deps = [
        ":static_test_threads",
        "//pw_thread:thread_facade_test",
    ],
)

cc_library(
    name = "yield",
    hdrs = [
        "public/pw_thread_freertos/yield_inline.h",
        "yield_public_overrides/pw_thread_backend/yield_inline.h",
    ],
    includes = [
        "public",
        "yield_public_overrides",
    ],
    deps = [
        "//pw_thread:yield.facade",
        "@freertos",
    ],
)

cc_library(
    name = "thread_iteration",
    srcs = [
        "pw_thread_freertos_private/thread_iteration.h",
        "thread_iteration.cc",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        ":freertos_tasktcb",
        "//pw_function",
        "//pw_span",
        "//pw_status",
        "//pw_thread:thread_info",
        "//pw_thread:thread_iteration.facade",
        "//pw_thread_freertos:util",
    ],
)

pw_cc_test(
    name = "thread_iteration_test",
    srcs = [
        "pw_thread_freertos_private/thread_iteration.h",
        "thread_iteration_test.cc",
    ],
    # TODO: b/271465588 - Get this test to build.
    tags = ["manual"],
    deps = [
        ":freertos_tasktcb",
        ":static_test_threads",
        ":thread_iteration",
        "//pw_bytes",
        "//pw_span",
        "//pw_string:builder",
        "//pw_string:util",
        "//pw_sync:thread_notification",
        "//pw_thread:non_portable_test_thread_options",
        "//pw_thread:thread",
        "//pw_thread:thread_info",
        "//pw_thread:thread_iteration",
    ],
)

cc_library(
    name = "util",
    srcs = [
        "util.cc",
    ],
    hdrs = [
        "public/pw_thread_freertos/util.h",
    ],
    includes = ["public"],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        "//pw_function",
        "//pw_log",
        "//pw_span",
        "//pw_status",
        "@freertos",
    ],
)

cc_library(
    name = "snapshot",
    srcs = [
        "snapshot.cc",
    ],
    hdrs = [
        "public/pw_thread_freertos/snapshot.h",
    ],
    # TODO: b/269204725 - Put this in the toolchain configuration instead.  I
    # would like to say `copts = ["-Wno-c++20-designator"]`, but arm-gcc tells
    # me that's an "unrecognized command line option"; I think it may be a
    # clang-only flag.
    copts = ["-Wno-pedantic"],
    target_compatible_with = [
        "//pw_build/constraints/rtos:freertos",
    ],
    deps = [
        ":freertos_tasktcb",
        ":util",
        "//pw_function",
        "//pw_log",
        "//pw_protobuf",
        "//pw_status",
        "//pw_thread:snapshot",
        "//pw_thread:thread_cc.pwpb",
    ],
)

cc_library(
    name = "freertos_tasktcb",
    hdrs = [
        "public/pw_thread_freertos/freertos_tsktcb.h",
        ":generate_freertos_tsktcb",
    ],
    includes = [
        "public",
        "thread_public_overrides",
    ],
)

run_binary(
    name = "generate_freertos_tsktcb",
    srcs = [
        "@freertos//:tasks.c",
    ],
    outs = [":thread_public_overrides/pw_thread_freertos_backend/freertos_tsktcb.h"],
    args = [
        "--freertos-tasks-c=$(location @freertos//:tasks.c)",
        "--output=$(location :thread_public_overrides/pw_thread_freertos_backend/freertos_tsktcb.h)",
    ],
    tool = "//pw_thread_freertos/py:generate_freertos_tsktcb",
)
