mirror of
https://github.com/meshtastic/meshtastic.git
synced 2024-11-10 07:34:11 -08:00
Merge branch 'master' into patch-2
This commit is contained in:
commit
ea894cffa7
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
|
@ -19,7 +19,7 @@ jobs:
|
|||
version: latest
|
||||
|
||||
- name: Run Biome
|
||||
run: biome ci .
|
||||
run: biome ci . --diagnostic-level=error
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
@ -40,4 +40,4 @@ jobs:
|
|||
run: pnpm install
|
||||
|
||||
- name: Build Package
|
||||
run: pnpm run build
|
||||
run: pnpm run build
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
"enabled": true
|
||||
},
|
||||
"files": {
|
||||
"ignoreUnknown": true
|
||||
"ignoreUnknown": true,
|
||||
"ignore": ["*.json"]
|
||||
},
|
||||
"vcs": {
|
||||
"enabled": true,
|
||||
|
|
|
@ -21,6 +21,10 @@ us on [Discord](https://discord.com/invite/ktMAKGBnBs) to add your group.
|
|||
- [YYC Mesh](https://yycmesh.com/)
|
||||
|
||||
## United States
|
||||
|
||||
### Arkansas
|
||||
- [Fort Smith Mesh](https://discord.com/invite/nwsvcXeqMX)
|
||||
|
||||
### California
|
||||
- [SoCal Mesh](https://socalmesh.org)
|
||||
- [Laguna Mesh](https://lagunamesh.com)
|
||||
|
@ -28,6 +32,9 @@ us on [Discord](https://discord.com/invite/ktMAKGBnBs) to add your group.
|
|||
- [Bay Area Mesh](https://canvis.app/z2k8a8)
|
||||
- [San Diego Mesh](https://discord.gg/HzE248x2)
|
||||
|
||||
### Colorado
|
||||
- [Denver Mesh](https://denvermesh.org)
|
||||
|
||||
### Hawaii
|
||||
- [Hawaii Meshnet](https://www.hawaiimesh.net/)
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ Enables the canned message module.
|
|||
|
||||
Sends a bell character with each message.
|
||||
|
||||
The [External Notification Module](external-notification) can be set up to beep when a new message arrives.
|
||||
The [External Notification Module](external-notification.mdx) can be set up to beep when a new message arrives.
|
||||
This module can also be configured to beep only when a message contains the bell character.
|
||||
|
||||
### Messages
|
||||
|
|
|
@ -65,5 +65,5 @@ This configures the frequency the radio is set to. Check out the [frequency cal
|
|||
- If you are part of a large mesh and don't know what a setting does, don't change it (unless you're super curious).
|
||||
- Leave your [MAX HOPS](/docs/configuration/radio/lora#max-hops) set to 3 unless you're sure you need more (or less) to reach your destination node.
|
||||
- TEST your settings and hardware before you install in hard-to-reach locations.
|
||||
- Connecting a node to the [public MQTT server](./module/mqtt#connect-to-the-default-public-server) may publish the locations of all nodes in your mesh to the internet. This will also add every globally connected node to your node database and potentially flood your mesh with all types of packets.
|
||||
- Connecting a node to the [public MQTT server](/docs/configuration/module/mqtt#connect-to-the-default-public-server) may publish the locations of all nodes in your mesh to the internet. This will also add every globally connected node to your node database and potentially flood your mesh with all types of packets.
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import Link from "@docusaurus/Link";
|
|||
## Flash Firmware
|
||||
|
||||
:::info
|
||||
You may now use the [Meshtastic Web Flasher](https://flasher.mesthastic.org) to download and copy firmware to your nRF52 or RP2040-based devices. Alternatively, follow the instructions below to download and install firmware.
|
||||
You may now use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) to download and copy firmware to your nRF52 or RP2040-based devices. Alternatively, follow the instructions below to download and install firmware.
|
||||
:::
|
||||
|
||||
### nRF52
|
||||
|
|
|
@ -10,7 +10,7 @@ import Link from "@docusaurus/Link";
|
|||
Meshtastic uses the [littlefs](https://github.com/littlefs-project/littlefs) library to store configuration, logs, and other data in the internal flash of nRF52 & RP2040 devices. Updating the firmware does _not_ erase this additional data, which can cause issues when the format and location of data changes between releases.
|
||||
|
||||
:::info
|
||||
You may now use the [Meshtastic Web Flasher](https://flasher.mesthastic.org) to Factory Erase your nRF52 or RP2040-based devices. Visit the flasher, select your board, and click the trash can icon to the right of the Flash button. This will open a dialogue to begin the erase procedure.
|
||||
You may now use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) to Factory Erase your nRF52 or RP2040-based devices. Visit the flasher, select your board, and click the trash can icon to the right of the Flash button. This will open a dialogue to begin the erase procedure.
|
||||
|
||||
Alternatively, follow the instructions below.
|
||||
:::
|
||||
|
|
|
@ -13,3 +13,4 @@ sidebar_position: 1
|
|||
- **Long press:** Will signal the device to shutdown after 5 seconds.
|
||||
- **Single press:** Changes the information page displayed on the device's screen.
|
||||
- **Double press:** Sends an adhoc ping of the device's position to the network.
|
||||
- **Triple press:** Enables/Disables the GPS Module on demand. If an NPN Transistor is added it will cut power to the GPS board. The NPN pin must be configured on the PIN_GPS_EN inside the Position module in the App for this switching to work.
|
||||
|
|
|
@ -119,6 +119,8 @@ The RAK11200 does not contain a LoRa transceiver, and thus needs to be added sep
|
|||
- International
|
||||
- [RAK Wireless Store](https://store.rakwireless.com/products/wiscore-esp32-module-rak11200)
|
||||
- [RAK Wireless Aliexpress](https://www.aliexpress.us/item/3256802312474717.html)
|
||||
- US
|
||||
- [Rokland](https://store.rokland.com/products/rakwireless-rak11200-wifi-and-ble-espressif-esp32-wrover-pid-110023)
|
||||
|
||||
<img
|
||||
alt="RAK4631 5005 11200"
|
||||
|
|
|
@ -24,4 +24,6 @@ Please see the RAK documentation for the correct way to connect your hardware to
|
|||
- RAK's [GitHub Page](https://github.com/RAKWireless/WisBlock) for the WisBlock
|
||||
- Purchase links
|
||||
- See purchase links under specific base boards, core modules, and peripherals
|
||||
- US Distributor [RAK Wireless Starter Kit](https://store.rakwireless.com/products/wisblock-meshtastic-starter-kit)
|
||||
- China RAK Direct [RAK Wireless Starter Kit w/ Gen2 Base board](https://store.rakwireless.com/products/wisblock-meshtastic-starter-kit)
|
||||
- US Distributor Rokland [RAK Wireless Starter Kit w/ Gen2 Base board](https://store.rokland.com/products/rak-wireless-wisblock-meshtastic-starter-kit)
|
||||
- US Distributor Rokland [RAK Wireless Starter Kit w/ Gen1 Base board](https://store.rokland.com/products/rakwireless-meshtastic-starter-kit-alternative-with-rak5005-o-base)
|
||||
|
|
|
@ -4,136 +4,137 @@ require("dotenv").config();
|
|||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
title: "Meshtastic",
|
||||
tagline:
|
||||
"An open source, off-grid, decentralized, mesh network built to run on affordable, low-power devices",
|
||||
url: "https://meshtastic.org",
|
||||
baseUrl: "/",
|
||||
onBrokenLinks: "throw",
|
||||
onBrokenMarkdownLinks: "warn",
|
||||
favicon: "design/web/favicon.ico",
|
||||
organizationName: "meshtastic",
|
||||
projectName: "meshtastic",
|
||||
themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ {
|
||||
docs: {
|
||||
sidebar: {
|
||||
autoCollapseCategories: true,
|
||||
},
|
||||
},
|
||||
navbar: {
|
||||
title: "Meshtastic",
|
||||
hideOnScroll: true,
|
||||
logo: {
|
||||
alt: "Meshtastic Logo",
|
||||
src: "design/logo/svg/Mesh_Logo_Black.svg",
|
||||
srcDark: "design/logo/svg/Mesh_Logo_White.svg",
|
||||
},
|
||||
items: [
|
||||
{
|
||||
label: "Docs",
|
||||
to: "docs/introduction",
|
||||
},
|
||||
{
|
||||
label: "Downloads",
|
||||
to: "downloads",
|
||||
},
|
||||
{
|
||||
label: "About",
|
||||
position: "right",
|
||||
items: [
|
||||
{
|
||||
label: "Introduction",
|
||||
to: "docs/introduction",
|
||||
},
|
||||
{
|
||||
label: "Getting Started",
|
||||
to: "docs/getting-started",
|
||||
},
|
||||
{
|
||||
label: "Contributing",
|
||||
to: "docs/contributing",
|
||||
},
|
||||
{
|
||||
label: "Legal",
|
||||
to: "docs/legal",
|
||||
},
|
||||
{
|
||||
label: "FAQs",
|
||||
to: "docs/faq",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
href: "https://github.com/meshtastic",
|
||||
position: "right",
|
||||
className: "header-github-link",
|
||||
"aria-label": "GitHub repository",
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
copyright: `<a href="https://vercel.com/?utm_source=meshtastic&utm_campaign=oss">Powered by ▲ Vercel</a> | Meshtastic® is a registered trademark of Meshtastic LLC. | <a href="/docs/legal">Legal Information</a>.`,
|
||||
},
|
||||
algolia: {
|
||||
appId: "IG2GQB8L3V",
|
||||
apiKey: "2e4348812173ec7ea6f7879c7032bb21",
|
||||
indexName: "meshtastic",
|
||||
contextualSearch: false,
|
||||
searchPagePath: "search",
|
||||
},
|
||||
colorMode: {
|
||||
respectPrefersColorScheme: true,
|
||||
},
|
||||
mermaid: {
|
||||
theme: { light: "base", dark: "base" },
|
||||
options: {
|
||||
themeVariables: {
|
||||
primaryColor: "#67EA94",
|
||||
primaryTextColor: "var(--tw-prose-headings)",
|
||||
primaryBorderColor: "#4D4D4D",
|
||||
lineColor: "#EAD667",
|
||||
secondaryColor: "#EA67BD",
|
||||
tertiaryColor: "#677CEA",
|
||||
},
|
||||
},
|
||||
},
|
||||
title: "Meshtastic",
|
||||
tagline:
|
||||
"An open source, off-grid, decentralized, mesh network built to run on affordable, low-power devices",
|
||||
url: "https://meshtastic.org",
|
||||
baseUrl: "/",
|
||||
trailingSlash: true,
|
||||
onBrokenLinks: "throw",
|
||||
onBrokenMarkdownLinks: "warn",
|
||||
favicon: "design/web/favicon.ico",
|
||||
organizationName: "meshtastic",
|
||||
projectName: "meshtastic",
|
||||
themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ {
|
||||
docs: {
|
||||
sidebar: {
|
||||
autoCollapseCategories: true,
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
() => {
|
||||
return {
|
||||
name: "docusaurus-tailwindcss",
|
||||
configurePostCss(postcssOptions) {
|
||||
postcssOptions.plugins.push(require("tailwindcss"));
|
||||
postcssOptions.plugins.push(require("autoprefixer"));
|
||||
return postcssOptions;
|
||||
},
|
||||
};
|
||||
navbar: {
|
||||
title: "Meshtastic",
|
||||
hideOnScroll: true,
|
||||
logo: {
|
||||
alt: "Meshtastic Logo",
|
||||
src: "design/logo/svg/Mesh_Logo_Black.svg",
|
||||
srcDark: "design/logo/svg/Mesh_Logo_White.svg",
|
||||
},
|
||||
items: [
|
||||
{
|
||||
label: "Docs",
|
||||
to: "docs/introduction",
|
||||
},
|
||||
],
|
||||
presets: [
|
||||
[
|
||||
"@docusaurus/preset-classic",
|
||||
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||
{
|
||||
label: "Downloads",
|
||||
to: "downloads",
|
||||
},
|
||||
{
|
||||
label: "About",
|
||||
position: "right",
|
||||
items: [
|
||||
{
|
||||
docs: {
|
||||
sidebarPath: require.resolve("./sidebars.js"),
|
||||
editUrl: "https://github.com/meshtastic/meshtastic/edit/master/",
|
||||
breadcrumbs: false,
|
||||
showLastUpdateAuthor: true,
|
||||
},
|
||||
theme: {
|
||||
customCss: require.resolve("./src/css/custom.css"),
|
||||
},
|
||||
label: "Introduction",
|
||||
to: "docs/introduction",
|
||||
},
|
||||
],
|
||||
{
|
||||
label: "Getting Started",
|
||||
to: "docs/getting-started",
|
||||
},
|
||||
{
|
||||
label: "Contributing",
|
||||
to: "docs/contributing",
|
||||
},
|
||||
{
|
||||
label: "Legal",
|
||||
to: "docs/legal",
|
||||
},
|
||||
{
|
||||
label: "FAQs",
|
||||
to: "docs/faq",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
href: "https://github.com/meshtastic",
|
||||
position: "right",
|
||||
className: "header-github-link",
|
||||
"aria-label": "GitHub repository",
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
copyright: `<a href="https://vercel.com/?utm_source=meshtastic&utm_campaign=oss">Powered by ▲ Vercel</a> | Meshtastic® is a registered trademark of Meshtastic LLC. | <a href="/docs/legal">Legal Information</a>.`,
|
||||
},
|
||||
algolia: {
|
||||
appId: "IG2GQB8L3V",
|
||||
apiKey: "2e4348812173ec7ea6f7879c7032bb21",
|
||||
indexName: "meshtastic",
|
||||
contextualSearch: false,
|
||||
searchPagePath: "search",
|
||||
},
|
||||
colorMode: {
|
||||
respectPrefersColorScheme: true,
|
||||
},
|
||||
mermaid: {
|
||||
theme: { light: "base", dark: "base" },
|
||||
options: {
|
||||
themeVariables: {
|
||||
primaryColor: "#67EA94",
|
||||
primaryTextColor: "var(--tw-prose-headings)",
|
||||
primaryBorderColor: "#4D4D4D",
|
||||
lineColor: "#EAD667",
|
||||
secondaryColor: "#EA67BD",
|
||||
tertiaryColor: "#677CEA",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
() => {
|
||||
return {
|
||||
name: "docusaurus-tailwindcss",
|
||||
configurePostCss(postcssOptions) {
|
||||
postcssOptions.plugins.push(require("tailwindcss"));
|
||||
postcssOptions.plugins.push(require("autoprefixer"));
|
||||
return postcssOptions;
|
||||
},
|
||||
};
|
||||
},
|
||||
],
|
||||
presets: [
|
||||
[
|
||||
"@docusaurus/preset-classic",
|
||||
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||
{
|
||||
docs: {
|
||||
sidebarPath: require.resolve("./sidebars.js"),
|
||||
editUrl: "https://github.com/meshtastic/meshtastic/edit/master/",
|
||||
breadcrumbs: false,
|
||||
showLastUpdateAuthor: true,
|
||||
},
|
||||
theme: {
|
||||
customCss: require.resolve("./src/css/custom.css"),
|
||||
},
|
||||
},
|
||||
],
|
||||
customFields: {
|
||||
API_URL: process.env.API_URL,
|
||||
},
|
||||
markdown: {
|
||||
mermaid: true,
|
||||
},
|
||||
themes: ["@docusaurus/theme-mermaid"],
|
||||
],
|
||||
customFields: {
|
||||
API_URL: process.env.API_URL,
|
||||
},
|
||||
markdown: {
|
||||
mermaid: true,
|
||||
},
|
||||
themes: ["@docusaurus/theme-mermaid"],
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
"tailwindcss": "^3.4.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^1.5.0",
|
||||
"@biomejs/biome": "^1.5.3",
|
||||
"@buf/meshtastic_protobufs.bufbuild_es": "1.6.0-20240106203407-94f78518ac45.1",
|
||||
"@docusaurus/module-type-aliases": "3.1.0",
|
||||
"@tailwindcss/typography": "^0.5.10",
|
||||
|
|
|
@ -65,8 +65,8 @@ dependencies:
|
|||
|
||||
devDependencies:
|
||||
'@biomejs/biome':
|
||||
specifier: ^1.5.0
|
||||
version: 1.5.0
|
||||
specifier: ^1.5.3
|
||||
version: 1.5.3
|
||||
'@buf/meshtastic_protobufs.bufbuild_es':
|
||||
specifier: 1.6.0-20240106203407-94f78518ac45.1
|
||||
version: 1.6.0-20240106203407-94f78518ac45.1(@bufbuild/protobuf@1.6.0)
|
||||
|
@ -1551,24 +1551,24 @@ packages:
|
|||
to-fast-properties: 2.0.0
|
||||
dev: false
|
||||
|
||||
/@biomejs/biome@1.5.0:
|
||||
resolution: {integrity: sha512-ln+o5jbs109qpeDoA+5n+vlAPai3DhlK0tHtZXzQvu4tswFgxNiJCeIXmlW1DYHziTmtBImV3Y0uhbm2iVSE3Q==}
|
||||
/@biomejs/biome@1.5.3:
|
||||
resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==}
|
||||
engines: {node: '>=14.*'}
|
||||
hasBin: true
|
||||
requiresBuild: true
|
||||
optionalDependencies:
|
||||
'@biomejs/cli-darwin-arm64': 1.5.0
|
||||
'@biomejs/cli-darwin-x64': 1.5.0
|
||||
'@biomejs/cli-linux-arm64': 1.5.0
|
||||
'@biomejs/cli-linux-arm64-musl': 1.5.0
|
||||
'@biomejs/cli-linux-x64': 1.5.0
|
||||
'@biomejs/cli-linux-x64-musl': 1.5.0
|
||||
'@biomejs/cli-win32-arm64': 1.5.0
|
||||
'@biomejs/cli-win32-x64': 1.5.0
|
||||
'@biomejs/cli-darwin-arm64': 1.5.3
|
||||
'@biomejs/cli-darwin-x64': 1.5.3
|
||||
'@biomejs/cli-linux-arm64': 1.5.3
|
||||
'@biomejs/cli-linux-arm64-musl': 1.5.3
|
||||
'@biomejs/cli-linux-x64': 1.5.3
|
||||
'@biomejs/cli-linux-x64-musl': 1.5.3
|
||||
'@biomejs/cli-win32-arm64': 1.5.3
|
||||
'@biomejs/cli-win32-x64': 1.5.3
|
||||
dev: true
|
||||
|
||||
/@biomejs/cli-darwin-arm64@1.5.0:
|
||||
resolution: {integrity: sha512-3+D7axf04dpadGMOaqb2q+zyQnhWW0o/Imt7TJBWsoE0N3/+28Wht8g3UEHHcUL5FPuGIfsE+NcYntBaaAsEIg==}
|
||||
/@biomejs/cli-darwin-arm64@1.5.3:
|
||||
resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
@ -1576,8 +1576,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-darwin-x64@1.5.0:
|
||||
resolution: {integrity: sha512-8k5aaLWE/B6ZAXLC+z/Vwh9ogyiSaiRIfvg+F9foxuneHl2R/D/2Iy7pvd3Yoi4Kf6/MBdowekPVezGP4/Kbcw==}
|
||||
/@biomejs/cli-darwin-x64@1.5.3:
|
||||
resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
@ -1585,8 +1585,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-linux-arm64-musl@1.5.0:
|
||||
resolution: {integrity: sha512-+1B3J8tWLTOvP3+00Cap+XhEXMvxwCHvVfuywUsB7Sqd66NWic3wKJuGbGcS3PuCWtGuIFsiQMNAGqiOXG4uBQ==}
|
||||
/@biomejs/cli-linux-arm64-musl@1.5.3:
|
||||
resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
@ -1594,8 +1594,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-linux-arm64@1.5.0:
|
||||
resolution: {integrity: sha512-RiecxG71E1jnqiJZ3FaikVBDRkk2ohIxBo0O4o68g87y6Hug//G0S83sj6Wqyn8DgKMCRWQg+XYMgk5CwLVowA==}
|
||||
/@biomejs/cli-linux-arm64@1.5.3:
|
||||
resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
@ -1603,8 +1603,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-linux-x64-musl@1.5.0:
|
||||
resolution: {integrity: sha512-4S2rLluc0WT+XTbLTgcm9+5EEFwJmoGiUEzR6N0P2sIjZD8c5KNf9Ou46BP1Pdg5AgqV+IIClGPK1I80ApSh1Q==}
|
||||
/@biomejs/cli-linux-x64-musl@1.5.3:
|
||||
resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
@ -1612,8 +1612,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-linux-x64@1.5.0:
|
||||
resolution: {integrity: sha512-TlTsG+ptSmnDTUsAAYsXyGOXMcFiF8SiwhPdj4YsNkJRgx9M2curEVcTVm66FINIPK6VJTUcEDahFlx3NPUOzA==}
|
||||
/@biomejs/cli-linux-x64@1.5.3:
|
||||
resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
@ -1621,8 +1621,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-win32-arm64@1.5.0:
|
||||
resolution: {integrity: sha512-sWOi1SR+YqJuXElBncGRnWBR7IN7ni6GQY4Zm/vTpP6nVA0dX5C301eQUW1N/VnFQb6fyrJTcBslDUKyemsN/g==}
|
||||
/@biomejs/cli-win32-arm64@1.5.3:
|
||||
resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
@ -1630,8 +1630,8 @@ packages:
|
|||
dev: true
|
||||
optional: true
|
||||
|
||||
/@biomejs/cli-win32-x64@1.5.0:
|
||||
resolution: {integrity: sha512-OoqgUXyzmRwX466bklOsWS7WdcvWtBuxF94DXATNe7bUiBa2tlW8QX7VVZvPnMKH57E5J619AkB3b5fhzyUhXA==}
|
||||
/@biomejs/cli-win32-x64@1.5.3:
|
||||
resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==}
|
||||
engines: {node: '>=14.*'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
|
12
sidebars.js
12
sidebars.js
|
@ -2,10 +2,10 @@
|
|||
|
||||
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
|
||||
module.exports = {
|
||||
Sidebar: [
|
||||
{
|
||||
type: "autogenerated",
|
||||
dirName: ".",
|
||||
},
|
||||
],
|
||||
Sidebar: [
|
||||
{
|
||||
type: "autogenerated",
|
||||
dirName: ".",
|
||||
},
|
||||
],
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import React from "react";
|
||||
import type React from "react";
|
||||
|
||||
export interface ColorModeProps {
|
||||
children: React.ReactNode;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import React from "react";
|
||||
import type React from "react";
|
||||
|
||||
import Layout from "@theme/Layout";
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import React from "react";
|
||||
import type React from "react";
|
||||
|
||||
import { FiExternalLink } from "react-icons/fi";
|
||||
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
import { Protobuf, Types } from "@meshtastic/js";
|
||||
import React, { useEffect } from "react";
|
||||
import React, { useEffect, useState } from "react";
|
||||
|
||||
interface Region {
|
||||
freq_start: number;
|
||||
freq_end: number;
|
||||
duty_cycle: number;
|
||||
freqStart: number;
|
||||
freqEnd: number;
|
||||
dutyCycle: number;
|
||||
spacing: number;
|
||||
power_limit: number;
|
||||
powerLimit: number;
|
||||
}
|
||||
|
||||
interface Modem {
|
||||
|
@ -22,181 +22,181 @@ const RegionData = new Map<
|
|||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.US,
|
||||
{
|
||||
freq_start: 902.0,
|
||||
freq_end: 928.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 902.0,
|
||||
freqEnd: 928.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 30,
|
||||
powerLimit: 30,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.EU_433,
|
||||
{
|
||||
freq_start: 433.0,
|
||||
freq_end: 434.0,
|
||||
duty_cycle: 10,
|
||||
freqStart: 433.0,
|
||||
freqEnd: 434.0,
|
||||
dutyCycle: 10,
|
||||
spacing: 0,
|
||||
power_limit: 12,
|
||||
powerLimit: 12,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.EU_868,
|
||||
{
|
||||
freq_start: 869.4,
|
||||
freq_end: 869.65,
|
||||
duty_cycle: 10,
|
||||
freqStart: 869.4,
|
||||
freqEnd: 869.65,
|
||||
dutyCycle: 10,
|
||||
spacing: 0,
|
||||
power_limit: 27,
|
||||
powerLimit: 27,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.CN,
|
||||
{
|
||||
freq_start: 470.0,
|
||||
freq_end: 510.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 470.0,
|
||||
freqEnd: 510.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 19,
|
||||
powerLimit: 19,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.JP,
|
||||
{
|
||||
freq_start: 920.8,
|
||||
freq_end: 927.8,
|
||||
duty_cycle: 100,
|
||||
freqStart: 920.8,
|
||||
freqEnd: 927.8,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 16,
|
||||
powerLimit: 16,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.ANZ,
|
||||
{
|
||||
freq_start: 915.0,
|
||||
freq_end: 928.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 915.0,
|
||||
freqEnd: 928.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 30,
|
||||
powerLimit: 30,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.RU,
|
||||
{
|
||||
freq_start: 868.7,
|
||||
freq_end: 869.2,
|
||||
duty_cycle: 100,
|
||||
freqStart: 868.7,
|
||||
freqEnd: 869.2,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 20,
|
||||
powerLimit: 20,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.KR,
|
||||
{
|
||||
freq_start: 920.0,
|
||||
freq_end: 923.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 920.0,
|
||||
freqEnd: 923.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 0,
|
||||
powerLimit: 0,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.TW,
|
||||
{
|
||||
freq_start: 920.0,
|
||||
freq_end: 925.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 920.0,
|
||||
freqEnd: 925.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 0,
|
||||
powerLimit: 0,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.IN,
|
||||
{
|
||||
freq_start: 865.0,
|
||||
freq_end: 867.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 865.0,
|
||||
freqEnd: 867.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 30,
|
||||
powerLimit: 30,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.NZ_865,
|
||||
{
|
||||
freq_start: 864.0,
|
||||
freq_end: 868.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 864.0,
|
||||
freqEnd: 868.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 36,
|
||||
powerLimit: 36,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.TH,
|
||||
{
|
||||
freq_start: 920.0,
|
||||
freq_end: 925.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 920.0,
|
||||
freqEnd: 925.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 16,
|
||||
powerLimit: 16,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.UA_433,
|
||||
{
|
||||
freq_start: 433.0,
|
||||
freq_end: 434.7,
|
||||
duty_cycle: 10,
|
||||
freqStart: 433.0,
|
||||
freqEnd: 434.7,
|
||||
dutyCycle: 10,
|
||||
spacing: 0,
|
||||
power_limit: 10,
|
||||
powerLimit: 10,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.UA_868,
|
||||
{
|
||||
freq_start: 868.0,
|
||||
freq_end: 868.6,
|
||||
duty_cycle: 1,
|
||||
freqStart: 868.0,
|
||||
freqEnd: 868.6,
|
||||
dutyCycle: 1,
|
||||
spacing: 0,
|
||||
power_limit: 14,
|
||||
powerLimit: 14,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.MY_433,
|
||||
{
|
||||
freq_start: 433.0,
|
||||
freq_end: 435.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 433.0,
|
||||
freqEnd: 435.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 20,
|
||||
powerLimit: 20,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.MY_919,
|
||||
{
|
||||
freq_start: 919.0,
|
||||
freq_end: 924.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 919.0,
|
||||
freqEnd: 924.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 27,
|
||||
powerLimit: 27,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.LORA_24,
|
||||
{
|
||||
freq_start: 2400.0,
|
||||
freq_end: 2483.5,
|
||||
duty_cycle: 100,
|
||||
freqStart: 2400.0,
|
||||
freqEnd: 2483.5,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 10,
|
||||
powerLimit: 10,
|
||||
},
|
||||
],
|
||||
[
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.UNSET,
|
||||
{
|
||||
freq_start: 902.0,
|
||||
freq_end: 928.0,
|
||||
duty_cycle: 100,
|
||||
freqStart: 902.0,
|
||||
freqEnd: 928.0,
|
||||
dutyCycle: 100,
|
||||
spacing: 0,
|
||||
power_limit: 30,
|
||||
powerLimit: 30,
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
@ -273,24 +273,24 @@ const modemPresets = new Map<
|
|||
|
||||
export const FrequencyCalculator = (): JSX.Element => {
|
||||
const [modemPreset, setModemPreset] =
|
||||
React.useState<Protobuf.Config.Config_LoRaConfig_ModemPreset>(
|
||||
useState<Protobuf.Config.Config_LoRaConfig_ModemPreset>(
|
||||
Protobuf.Config.Config_LoRaConfig_ModemPreset.LONG_FAST,
|
||||
);
|
||||
const [region, setRegion] =
|
||||
React.useState<Protobuf.Config.Config_LoRaConfig_RegionCode>(
|
||||
useState<Protobuf.Config.Config_LoRaConfig_RegionCode>(
|
||||
Protobuf.Config.Config_LoRaConfig_RegionCode.US,
|
||||
);
|
||||
const [channel, setChannel] = React.useState<Types.ChannelNumber>(
|
||||
Types.ChannelNumber.PRIMARY,
|
||||
const [channel, setChannel] = useState<Types.ChannelNumber>(
|
||||
Types.ChannelNumber.Primary,
|
||||
);
|
||||
const [numChannels, setNumChannels] = React.useState<number>(0);
|
||||
const [channelFrequency, setChannelFrequency] = React.useState<number>(0);
|
||||
const [numChannels, setNumChannels] = useState<number>(0);
|
||||
const [channelFrequency, setChannelFrequency] = useState<number>(0);
|
||||
|
||||
useEffect(() => {
|
||||
const selectedRegion = RegionData.get(region);
|
||||
const selectedModemPreset = modemPresets.get(modemPreset);
|
||||
const calculatedNumChannels = Math.floor(
|
||||
(selectedRegion.freq_end - selectedRegion.freq_start) /
|
||||
(selectedRegion.freqEnd - selectedRegion.freqStart) /
|
||||
(selectedRegion.spacing + selectedModemPreset.bw / 1000),
|
||||
);
|
||||
|
||||
|
@ -304,7 +304,7 @@ export const FrequencyCalculator = (): JSX.Element => {
|
|||
setChannel(updatedChannel);
|
||||
|
||||
setChannelFrequency(
|
||||
selectedRegion.freq_start +
|
||||
selectedRegion.freqStart +
|
||||
selectedModemPreset.bw / 2000 +
|
||||
updatedChannel * (selectedModemPreset.bw / 1000),
|
||||
);
|
||||
|
@ -318,7 +318,7 @@ export const FrequencyCalculator = (): JSX.Element => {
|
|||
value={modemPreset}
|
||||
onChange={(e) =>
|
||||
setModemPreset(
|
||||
parseInt(
|
||||
Number.parseInt(
|
||||
e.target.value,
|
||||
) as Protobuf.Config.Config_LoRaConfig_ModemPreset,
|
||||
)
|
||||
|
@ -335,7 +335,7 @@ export const FrequencyCalculator = (): JSX.Element => {
|
|||
<label>Region:</label>
|
||||
<select
|
||||
value={region}
|
||||
onChange={(e) => setRegion(parseInt(e.target.value))}
|
||||
onChange={(e) => setRegion(Number.parseInt(e.target.value))}
|
||||
>
|
||||
{Array.from(RegionData.keys()).map((key) => (
|
||||
<option key={key} value={key}>
|
||||
|
@ -344,11 +344,17 @@ export const FrequencyCalculator = (): JSX.Element => {
|
|||
))}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div className="flex gap-2 mb-4">
|
||||
<label className="font-semibold">Number of channels:</label>
|
||||
<input type="number" disabled={true} value={numChannels} />
|
||||
</div>
|
||||
|
||||
<div className="flex gap-2">
|
||||
<label>Channel:</label>
|
||||
<select
|
||||
value={channel}
|
||||
onChange={(e) => setChannel(parseInt(e.target.value))}
|
||||
onChange={(e) => setChannel(Number.parseInt(e.target.value))}
|
||||
>
|
||||
{Array.from(Array(numChannels).keys()).map((key) => (
|
||||
<option key={key} value={key}>
|
||||
|
@ -358,10 +364,6 @@ export const FrequencyCalculator = (): JSX.Element => {
|
|||
</select>
|
||||
</div>
|
||||
|
||||
<div className="flex gap-2">
|
||||
<label className="font-semibold">Number of channels:</label>
|
||||
<input type="number" disabled={true} value={numChannels} />
|
||||
</div>
|
||||
<div className="flex gap-2">
|
||||
<label className="font-semibold">Channel Frequency:</label>
|
||||
<input type="number" disabled={true} value={channelFrequency} />
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { DeviceFirmwareResource } from "../../../utils/apiTypes";
|
||||
import type { DeviceFirmwareResource } from "../../../utils/apiTypes";
|
||||
|
||||
export interface releaseCardProps {
|
||||
variant: string;
|
||||
|
@ -66,7 +66,9 @@ export const PlaceholderFirmwareCard = (): JSX.Element => {
|
|||
<div className="rounded-md bg-gray-500 w-32 h-4" />
|
||||
</div>
|
||||
<div className="card__body rounded-md bg-gray-500 h-12" />
|
||||
<a className="button disabled button--primary button--block"> </a>
|
||||
<span className="button disabled button--primary button--block" href="#">
|
||||
|
||||
</span>
|
||||
<div className="rounded-md bg-gray-500 w-32 h-8" />
|
||||
<div className="rounded-md bg-gray-500 w-44 h-4" />
|
||||
<div className="rounded-md bg-gray-500 w-36 h-4" />
|
||||
|
|
|
@ -10,7 +10,7 @@ import {
|
|||
} from "@heroicons/react/24/solid";
|
||||
import Layout from "@theme/Layout";
|
||||
|
||||
import { FirmwareReleases } from "../../utils/apiTypes";
|
||||
import type { FirmwareReleases } from "../../utils/apiTypes";
|
||||
import { fetcher } from "../../utils/swr";
|
||||
import {
|
||||
FirmwareCard,
|
||||
|
@ -63,7 +63,8 @@ const Firmware = (): JSX.Element => {
|
|||
<div className="card__body">
|
||||
<p>
|
||||
Devices such as T-Echo, RAK4631, and RAK11300 are flashed via
|
||||
filesystem. Use the web flasher to download applicable firmware.
|
||||
filesystem. Use the web flasher to download applicable
|
||||
firmware.
|
||||
</p>
|
||||
</div>
|
||||
<div className="card__footer mt-auto">
|
||||
|
|
|
@ -4,7 +4,10 @@ import useBaseUrl from "@docusaurus/useBaseUrl";
|
|||
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
|
||||
import Layout from "@theme/Layout";
|
||||
|
||||
import { SocialCard, SocialCardProps } from "../components/homepage/SocialCard";
|
||||
import {
|
||||
SocialCard,
|
||||
type SocialCardProps,
|
||||
} from "../components/homepage/SocialCard";
|
||||
|
||||
const SocialCards: SocialCardProps[] = [
|
||||
{
|
||||
|
|
|
@ -85,7 +85,7 @@ const OEM = (): JSX.Element => {
|
|||
<span>Font</span>
|
||||
<select
|
||||
onChange={(e) => {
|
||||
setOemFont(parseInt(e.target.value));
|
||||
setOemFont(Number.parseInt(e.target.value));
|
||||
}}
|
||||
>
|
||||
{enumOptions.map(([name, value]) => (
|
||||
|
@ -102,7 +102,7 @@ const OEM = (): JSX.Element => {
|
|||
readFile(e.target.files[0]).then((data) => {
|
||||
setOemIconBits(
|
||||
new Uint8Array(
|
||||
data.split(",").map((s) => parseInt(s.trim(), 16)),
|
||||
data.split(",").map((s) => Number.parseInt(s.trim(), 16)),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
@ -113,7 +113,7 @@ const OEM = (): JSX.Element => {
|
|||
type="number"
|
||||
name="oemIconHeight"
|
||||
onChange={(e) => {
|
||||
setOemIconHeight(parseInt(e.target.value));
|
||||
setOemIconHeight(Number.parseInt(e.target.value));
|
||||
}}
|
||||
/>
|
||||
<span>Logo Width</span>
|
||||
|
@ -121,7 +121,7 @@ const OEM = (): JSX.Element => {
|
|||
type="number"
|
||||
name="oemIconWidth"
|
||||
onChange={(e) => {
|
||||
setOemIconWidth(parseInt(e.target.value));
|
||||
setOemIconWidth(Number.parseInt(e.target.value));
|
||||
}}
|
||||
/>
|
||||
<span>Boot Text</span>
|
||||
|
@ -132,7 +132,7 @@ const OEM = (): JSX.Element => {
|
|||
setOemText(e.target.value);
|
||||
}}
|
||||
/>
|
||||
<a
|
||||
<button
|
||||
className="cursor-pointer rounded-md bg-tertiary p-2 hover:brightness-90"
|
||||
download="OEM.bin"
|
||||
onClick={() => {
|
||||
|
@ -141,9 +141,10 @@ const OEM = (): JSX.Element => {
|
|||
});
|
||||
window.open(URL.createObjectURL(blob));
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
Download
|
||||
</a>
|
||||
</button>
|
||||
{oemBytes.toString()}
|
||||
</div>
|
||||
</Layout>
|
||||
|
|
|
@ -5,10 +5,10 @@ export default function calculateADC() {
|
|||
const batFullPercent = 1;
|
||||
//variable
|
||||
const batteryChargePercent =
|
||||
parseFloat(
|
||||
Number.parseFloat(
|
||||
(<HTMLInputElement>document.getElementById("batteryChargePercent")).value,
|
||||
) / 100;
|
||||
const operativeAdcMultiplier = parseFloat(
|
||||
const operativeAdcMultiplier = Number.parseFloat(
|
||||
(<HTMLInputElement>document.getElementById("operativeAdcMultiplier")).value,
|
||||
);
|
||||
const result =
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
import typography from "@tailwindcss/typography";
|
||||
import type { Config } from "tailwindcss";
|
||||
import typography from '@tailwindcss/typography'
|
||||
|
||||
export default {
|
||||
content: ["./src/**/*.{js,jsx,ts,tsx}"],
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
accent: "var(--accent)",
|
||||
base: "var(--base)",
|
||||
primary: "var(--primary)",
|
||||
secondary: "var(--secondary)",
|
||||
tertiary: "var(--tertiary)",
|
||||
mute: "var(--mute)",
|
||||
primaryInv: "var(--primaryInv)",
|
||||
secondaryInv: "var(--secondaryInv)",
|
||||
tertiaryInv: "var(--tertiaryInv)",
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [typography()],
|
||||
content: ["./src/**/*.{js,jsx,ts,tsx}"],
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
accent: "var(--accent)",
|
||||
base: "var(--base)",
|
||||
primary: "var(--primary)",
|
||||
secondary: "var(--secondary)",
|
||||
tertiary: "var(--tertiary)",
|
||||
mute: "var(--mute)",
|
||||
primaryInv: "var(--primaryInv)",
|
||||
secondaryInv: "var(--secondaryInv)",
|
||||
tertiaryInv: "var(--tertiaryInv)",
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [typography()],
|
||||
} satisfies Config;
|
||||
|
|
|
@ -57,6 +57,10 @@
|
|||
"source": "/docs/software/mqtt/",
|
||||
"destination": "/docs/software/integrations/mqtt"
|
||||
},
|
||||
{
|
||||
"source": "/docs/software/mqtt/:path*/",
|
||||
"destination": "/docs/software/integrations/mqtt/:path*/"
|
||||
},
|
||||
{
|
||||
"source": "/docs/getting-started/faq",
|
||||
"destination": "/docs/faq/"
|
||||
|
|
Loading…
Reference in a new issue