#nintendo #hardware #bridge #board #dev #console #wii-u

cat-dev

用于与任天堂分发的 CAT-DEV 硬件单元交互的库(即一种 Wii-U DevKits 类型)。

6 个版本

0.0.6 2024 年 3 月 30 日
0.0.5 2024 年 3 月 26 日
0.0.3 2024 年 2 月 18 日
0.0.1 2023 年 11 月 30 日

硬件支持 类别中排名 292

Download history

每月下载量 364

MIT 许可证

1MB
6K SLoC

cat-dev

用于与被称为 "cat-dev bridge" 的 CAT-DEV 交互的库。实际上,CAT-DEV 由两部分组成,一个是 "Host Bridge",这是我们真正与之交互的部分,另一个是实际的 "Cafe 主板"(如果您拥有 Cafe SDK v2.12.13 的合法副本——您可以在 /system/docs/man/en_us/dev/catdev/prerequisite/DevelopmentEnvironment.html 的文档页面中找到解释此流程的图片)。

稳定性

该包目前处于预 1.0 版本。我们将尽力最小化对库的破坏性更改,但仍有许多 CAT-DEV 的部分我们尚未完全弄清楚。因此,我们对这些 API 的稳定性或我们将遵循 SEM-VER 的承诺持谨慎态度,直到我们至少弄清楚所有这些问题。如果您因此受到影响或对此表示关注,请通过我们的 GitHub 仓库与我们联系。我们想尝试,并使其尽可能顺利。

"可能不需要的函数"

在使用函数之前请仔细阅读文档

由于该库与非常旧、非常容易出错的 CLI 工具的重现密切相关,因此存在一些仅用于重现这些有缺陷或显示不良的 CLIs 的函数。这些函数将在它们的文档中标记。

一个需要注意的关键点是:_with_logging_hooks 这些函数并不会神奇地启用日志记录,它们只是允许在日志基础设施之外运行 println!print! 的钩子。对于需要完全匹配其输出的工具重实现且不能使用正常日志基础设施的情况。

用法

以下是一些基本用例,这并不全面,但可能对您有所帮助。

findbridge 风格的发现

您可以通过以下方式在主机上发现所有桥接器

use cat_dev::mion::discovery::discover_bridges;

/// Fetching detailed fields grabs a few extra bits of information, these are
/// all prefixed with `detailed_` in the returned info structures, but for
/// completeness sake the fields are:
///
/// - `detailed_sdk_version`
/// - `detailed_boot_type`
/// - `detailed_is_cafe_on`
///
/// These all return options that will only be populated if
/// `fetch_detailed_fields` is marked as true.
async fn stream_bridges(fetch_detailed_fields: bool) {
  let mut channel_to_stream_bridges = discover_bridges(
    fetch_detailed_fields,
    None,
  ).await.expect("Failed to discover bridges!");

  // This will block for a potentially "long-ish" (like 10 seconds) time.
  //
  // Our CLI tool avoids this by timing out if we don't receive a bridge in enough time.
  // You can use `discover_and_collect_bridges` with an "early timeout" to get a much
  // faster loop here. Though you do have to wait for all of the results to come in.
  //
  // FWIW our timeout in the CLI Re-implementations is 3 seconds.
  while let Some(bridge) = channel_to_stream_bridges.recv().await {
    println!("Found bridge: {bridge}");
  }
}

getbridge 风格的查找特定桥接器

您可以通过以下方式获取有关特定桥接器的信息

use cat_dev::mion::discovery::{find_mion, MIONFindBy};
use std::time::Duration;

async fn find_a_mion_by_name(
  name: String,
  fetch_detailed_fields: bool,
  early_search_timeout: Option<Duration>,
) {
  if let Some(bridge) = find_mion(
    // You can also search by IP / Mac Address.
    MIONFindBy::Name(name),
    fetch_detailed_fields,
    // By default we wait the full 10 seconds to try and find a bridge with
    // this name, in many cases though if you don't get a response in under
    // 3, or sometimes even 1 second you're not gonna find it. If you don't
    // wanna wait the full 10 seconds you can specify an optional early
    // timeout.
    early_search_timeout,
    None,
  ).await.expect("could not conduct a search for a mion.") {
    println!("Found bridge: {bridge}");
  } else {
    panic!("No bridge present with that name :(");
  }
}

获取系统默认桥接器的信息

如果您正在与系统交互,那么您很可能有一个“默认桥接器”,如果没有提供名称,您希望默认使用它。您可以从主机状态中获取此桥接器的信息。

use cat_dev::BridgeHostState;

async fn get_default_mion() {
  let host_state = BridgeHostState::load()
    .await
    .expect("Could not load the state file of the bridges the computer knows about.");

  if let Some((bridge_name, optional_bridge_ip)) = host_state.get_default_bridge() {
    if let Some(bridge_ip) = optional_bridge_ip {
      println!("Found default bridge {bridge_name} @ {bridge_ip}!");
    } else {
      println!("Found default bridge named: {bridge_name}!");
      println!("No ip was saved though perhaps try searching for it?");
    }
  } else {
    println!("There was no default bridge :(");
  }
}

依赖项

~9-53MB
~789K SLoC