Merge branch 'master' into patch-2

This commit is contained in:
Ben Meadors 2024-02-10 08:59:47 -06:00 committed by GitHub
commit ea894cffa7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 322 additions and 295 deletions

View file

@ -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

View file

@ -4,7 +4,8 @@
"enabled": true
},
"files": {
"ignoreUnknown": true
"ignoreUnknown": true,
"ignore": ["*.json"]
},
"vcs": {
"enabled": true,

View file

@ -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/)

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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.
:::

View file

@ -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.

View file

@ -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"

View file

@ -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)

View file

@ -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;

View file

@ -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",

View file

@ -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]

View file

@ -2,10 +2,10 @@
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
module.exports = {
Sidebar: [
{
type: "autogenerated",
dirName: ".",
},
],
Sidebar: [
{
type: "autogenerated",
dirName: ".",
},
],
};

View file

@ -1,4 +1,4 @@
import React from "react";
import type React from "react";
export interface ColorModeProps {
children: React.ReactNode;

View file

@ -1,4 +1,4 @@
import React from "react";
import type React from "react";
import Layout from "@theme/Layout";

View file

@ -1,4 +1,4 @@
import React from "react";
import type React from "react";
import { FiExternalLink } from "react-icons/fi";

View file

@ -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} />

View file

@ -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">&nbsp;</a>
<span className="button disabled button--primary button--block" href="#">
&nbsp;
</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" />

View file

@ -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">

View file

@ -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[] = [
{

View file

@ -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>

View file

@ -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 =

View file

@ -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;

View file

@ -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/"