mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-26 19:57:20 +00:00
Merge remote-tracking branch 'origin/master' into develop
This commit is contained in:
30
.github/workflows/main_matrix.yml
vendored
30
.github/workflows/main_matrix.yml
vendored
@@ -294,6 +294,24 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v6
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- name: Generate release notes
|
||||||
|
id: release_notes
|
||||||
|
run: |
|
||||||
|
chmod +x ./bin/generate_release_notes.py
|
||||||
|
NOTES=$(./bin/generate_release_notes.py ${{ needs.version.outputs.long }})
|
||||||
|
echo "notes<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "$NOTES" >> $GITHUB_OUTPUT
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Create release
|
- name: Create release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
@@ -303,8 +321,7 @@ jobs:
|
|||||||
prerelease: true
|
prerelease: true
|
||||||
name: Meshtastic Firmware ${{ needs.version.outputs.long }} Alpha
|
name: Meshtastic Firmware ${{ needs.version.outputs.long }} Alpha
|
||||||
tag_name: v${{ needs.version.outputs.long }}
|
tag_name: v${{ needs.version.outputs.long }}
|
||||||
body: |
|
body: ${{ steps.release_notes.outputs.notes }}
|
||||||
Autogenerated by github action, developer should edit as required before publishing...
|
|
||||||
|
|
||||||
- name: Download source deb
|
- name: Download source deb
|
||||||
uses: actions/download-artifact@v7
|
uses: actions/download-artifact@v7
|
||||||
@@ -428,6 +445,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
@@ -447,6 +466,13 @@ jobs:
|
|||||||
pattern: manifest-${{ needs.version.outputs.long }}
|
pattern: manifest-${{ needs.version.outputs.long }}
|
||||||
path: ./publish
|
path: ./publish
|
||||||
|
|
||||||
|
- name: Generate release notes
|
||||||
|
run: |
|
||||||
|
chmod +x ./bin/generate_release_notes.py
|
||||||
|
./bin/generate_release_notes.py ${{ needs.version.outputs.long }} > ./publish/release_notes.md
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Publish firmware to meshtastic.github.io
|
- name: Publish firmware to meshtastic.github.io
|
||||||
uses: peaceiris/actions-gh-pages@v4
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
env:
|
env:
|
||||||
|
|||||||
31
.github/workflows/release_channels.yml
vendored
31
.github/workflows/release_channels.yml
vendored
@@ -48,6 +48,37 @@ jobs:
|
|||||||
${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
|
${{ contains(github.event.release.name, 'Beta') && 'beta' || contains(github.event.release.name, 'Alpha') && 'alpha' }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
publish-release-notes:
|
||||||
|
if: github.event.action == 'published'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Get release version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
# Extract version from tag (e.g., v2.7.15.567b8ea -> 2.7.15.567b8ea)
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/v}
|
||||||
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Get release notes
|
||||||
|
run: |
|
||||||
|
mkdir -p ./publish
|
||||||
|
gh release view ${{ github.event.release.tag_name }} --json body --jq '.body' > ./publish/release_notes.md
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Publish release notes to meshtastic.github.io
|
||||||
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
|
with:
|
||||||
|
deploy_key: ${{ secrets.DIST_PAGES_DEPLOY_KEY }}
|
||||||
|
external_repository: meshtastic/meshtastic.github.io
|
||||||
|
publish_branch: master
|
||||||
|
publish_dir: ./publish
|
||||||
|
destination_dir: firmware-${{ steps.version.outputs.version }}
|
||||||
|
user_name: github-actions[bot]
|
||||||
|
user_email: github-actions[bot]@users.noreply.github.com
|
||||||
|
commit_message: Release notes for ${{ steps.version.outputs.version }}
|
||||||
|
enable_jekyll: true
|
||||||
|
|
||||||
# Create a PR to bump version when a release is Published
|
# Create a PR to bump version when a release is Published
|
||||||
bump-version:
|
bump-version:
|
||||||
if: github.event.action == 'published'
|
if: github.event.action == 'published'
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ plugins:
|
|||||||
lint:
|
lint:
|
||||||
enabled:
|
enabled:
|
||||||
- checkov@3.2.497
|
- checkov@3.2.497
|
||||||
- renovate@42.75.0
|
- renovate@42.78.2
|
||||||
- prettier@3.7.4
|
- prettier@3.7.4
|
||||||
- trufflehog@3.92.4
|
- trufflehog@3.92.4
|
||||||
- yamllint@1.37.1
|
- yamllint@1.37.1
|
||||||
|
|||||||
355
bin/generate_release_notes.py
Executable file
355
bin/generate_release_notes.py
Executable file
@@ -0,0 +1,355 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Generate release notes from merged PRs on develop and master branches.
|
||||||
|
Categorizes PRs into Enhancements and Bug Fixes/Maintenance sections.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_release_tag():
|
||||||
|
"""Get the most recent release tag."""
|
||||||
|
result = subprocess.run(
|
||||||
|
["git", "describe", "--tags", "--abbrev=0"],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return result.stdout.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def get_tag_date(tag):
|
||||||
|
"""Get the commit date (ISO 8601) of the tag."""
|
||||||
|
result = subprocess.run(
|
||||||
|
["git", "show", "-s", "--format=%cI", tag],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return result.stdout.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def get_merged_prs_since_tag(tag, branch):
|
||||||
|
"""Get all merged PRs since the given tag on the specified branch."""
|
||||||
|
# Get commits since tag on the branch - look for PR numbers in parentheses
|
||||||
|
result = subprocess.run(
|
||||||
|
[
|
||||||
|
"git",
|
||||||
|
"log",
|
||||||
|
f"{tag}..origin/{branch}",
|
||||||
|
"--oneline",
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
prs = []
|
||||||
|
seen_pr_numbers = set()
|
||||||
|
|
||||||
|
for line in result.stdout.strip().split("\n"):
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Extract PR number from commit message - format: "Title (#1234)"
|
||||||
|
pr_match = re.search(r"\(#(\d+)\)", line)
|
||||||
|
if pr_match:
|
||||||
|
pr_number = pr_match.group(1)
|
||||||
|
if pr_number not in seen_pr_numbers:
|
||||||
|
seen_pr_numbers.add(pr_number)
|
||||||
|
prs.append(pr_number)
|
||||||
|
|
||||||
|
return prs
|
||||||
|
|
||||||
|
|
||||||
|
def get_pr_details(pr_number):
|
||||||
|
"""Get PR details from GitHub API via gh CLI."""
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
[
|
||||||
|
"gh",
|
||||||
|
"pr",
|
||||||
|
"view",
|
||||||
|
pr_number,
|
||||||
|
"--json",
|
||||||
|
"title,author,labels,url",
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return json.loads(result.stdout)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def should_exclude_pr(pr_details):
|
||||||
|
"""Check if PR should be excluded from release notes."""
|
||||||
|
if not pr_details:
|
||||||
|
return True
|
||||||
|
|
||||||
|
title = pr_details.get("title", "").lower()
|
||||||
|
|
||||||
|
# Exclude trunk update PRs
|
||||||
|
if "upgrade trunk" in title or "update trunk" in title or "trunk update" in title:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Exclude protobuf update PRs
|
||||||
|
if "update protobufs" in title or "update protobuf" in title:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Exclude automated version bump PRs
|
||||||
|
if "bump release version" in title or "bump version" in title:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_dependency_update(pr_details):
|
||||||
|
"""Check if PR is a dependency/chore update."""
|
||||||
|
if not pr_details:
|
||||||
|
return False
|
||||||
|
|
||||||
|
title = pr_details.get("title", "").lower()
|
||||||
|
author = pr_details.get("author", {}).get("login", "").lower()
|
||||||
|
labels = [label.get("name", "").lower() for label in pr_details.get("labels", [])]
|
||||||
|
|
||||||
|
# Check for renovate or dependabot authors
|
||||||
|
if "renovate" in author or "dependabot" in author:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Check for chore(deps) pattern
|
||||||
|
if re.match(r"^chore\(deps\):", title):
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Check for digest update patterns
|
||||||
|
if re.match(r".*digest to [a-f0-9]+", title, re.IGNORECASE):
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Check for dependency-related labels
|
||||||
|
dependency_labels = ["dependencies", "deps", "renovate"]
|
||||||
|
if any(dep in label for label in labels for dep in dependency_labels):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_enhancement(pr_details):
|
||||||
|
"""Determine if PR is an enhancement based on labels and title."""
|
||||||
|
labels = [label.get("name", "").lower() for label in pr_details.get("labels", [])]
|
||||||
|
|
||||||
|
# Check labels first
|
||||||
|
enhancement_labels = ["enhancement", "feature", "feat", "new feature"]
|
||||||
|
for label in labels:
|
||||||
|
if any(enh in label for enh in enhancement_labels):
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Check title prefixes
|
||||||
|
title = pr_details.get("title", "")
|
||||||
|
enhancement_prefixes = ["feat:", "feature:", "add:"]
|
||||||
|
title_lower = title.lower()
|
||||||
|
for prefix in enhancement_prefixes:
|
||||||
|
if title_lower.startswith(prefix) or f" {prefix}" in title_lower:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def clean_title(title):
|
||||||
|
"""Clean up PR title for release notes."""
|
||||||
|
# Remove common prefixes
|
||||||
|
prefixes_to_remove = [
|
||||||
|
r"^fix:\s*",
|
||||||
|
r"^feat:\s*",
|
||||||
|
r"^feature:\s*",
|
||||||
|
r"^bug:\s*",
|
||||||
|
r"^bugfix:\s*",
|
||||||
|
r"^chore:\s*",
|
||||||
|
r"^chore\([^)]+\):\s*",
|
||||||
|
r"^refactor:\s*",
|
||||||
|
r"^docs:\s*",
|
||||||
|
r"^ci:\s*",
|
||||||
|
r"^build:\s*",
|
||||||
|
r"^perf:\s*",
|
||||||
|
r"^style:\s*",
|
||||||
|
r"^test:\s*",
|
||||||
|
]
|
||||||
|
|
||||||
|
cleaned = title
|
||||||
|
for prefix in prefixes_to_remove:
|
||||||
|
cleaned = re.sub(prefix, "", cleaned, flags=re.IGNORECASE)
|
||||||
|
|
||||||
|
# Ensure first letter is capitalized
|
||||||
|
if cleaned:
|
||||||
|
cleaned = cleaned[0].upper() + cleaned[1:]
|
||||||
|
|
||||||
|
return cleaned.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def format_pr_line(pr_details):
|
||||||
|
"""Format a PR as a markdown bullet point."""
|
||||||
|
title = clean_title(pr_details.get("title", "Unknown"))
|
||||||
|
author = pr_details.get("author", {}).get("login", "unknown")
|
||||||
|
url = pr_details.get("url", "")
|
||||||
|
|
||||||
|
return f"- {title} by @{author} in {url}"
|
||||||
|
|
||||||
|
|
||||||
|
def get_new_contributors(pr_details_list, tag, repo="meshtastic/firmware"):
|
||||||
|
"""Find contributors who made their first merged PR before this release.
|
||||||
|
|
||||||
|
GitHub usernames do not necessarily match git commit authors, so we use the
|
||||||
|
GitHub search API via `gh` to see if the user has any merged PRs before the
|
||||||
|
tag date. This mirrors how GitHub's "Generate release notes" feature works.
|
||||||
|
"""
|
||||||
|
|
||||||
|
bot_authors = {"github-actions", "renovate", "dependabot", "app/renovate", "app/github-actions", "app/dependabot"}
|
||||||
|
|
||||||
|
new_contributors = []
|
||||||
|
seen_authors = set()
|
||||||
|
|
||||||
|
try:
|
||||||
|
tag_date = get_tag_date(tag)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print(f"Warning: Could not determine tag date for {tag}; skipping new contributor detection", file=sys.stderr)
|
||||||
|
return []
|
||||||
|
|
||||||
|
for pr in pr_details_list:
|
||||||
|
author = pr.get("author", {}).get("login", "")
|
||||||
|
if not author or author in seen_authors:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Skip bots
|
||||||
|
if author.lower() in bot_authors or author.startswith("app/"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
seen_authors.add(author)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Search for merged PRs by this author created before the tag date
|
||||||
|
search_query = f"is:pr author:{author} repo:{repo} closed:<=\"{tag_date}\""
|
||||||
|
search = subprocess.run(
|
||||||
|
[
|
||||||
|
"gh",
|
||||||
|
"search",
|
||||||
|
"issues",
|
||||||
|
"--json",
|
||||||
|
"number,mergedAt,createdAt",
|
||||||
|
"--state",
|
||||||
|
"closed",
|
||||||
|
"--limit",
|
||||||
|
"200",
|
||||||
|
search_query,
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
if search.returncode != 0:
|
||||||
|
# If gh fails, be conservative and skip adding to new contributors
|
||||||
|
print(f"Warning: gh search failed for author {author}: {search.stderr.strip()}", file=sys.stderr)
|
||||||
|
continue
|
||||||
|
|
||||||
|
results = json.loads(search.stdout or "[]")
|
||||||
|
# If any merged PR exists before or on tag date, not a new contributor
|
||||||
|
had_prior_pr = any(item.get("mergedAt") for item in results)
|
||||||
|
|
||||||
|
if not had_prior_pr:
|
||||||
|
new_contributors.append((author, pr.get("url", "")))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warning: Could not check contributor history for {author}: {e}", file=sys.stderr)
|
||||||
|
continue
|
||||||
|
|
||||||
|
return new_contributors
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Usage: generate_release_notes.py <new_version>", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
new_version = sys.argv[1]
|
||||||
|
|
||||||
|
# Get last release tag
|
||||||
|
try:
|
||||||
|
last_tag = get_last_release_tag()
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Error: Could not find last release tag", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Collect PRs from both branches
|
||||||
|
all_pr_numbers = set()
|
||||||
|
|
||||||
|
for branch in ["develop", "master"]:
|
||||||
|
try:
|
||||||
|
prs = get_merged_prs_since_tag(last_tag, branch)
|
||||||
|
all_pr_numbers.update(prs)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warning: Could not get PRs from {branch}: {e}", file=sys.stderr)
|
||||||
|
|
||||||
|
# Get details for all PRs
|
||||||
|
enhancements = []
|
||||||
|
bug_fixes = []
|
||||||
|
dependencies = []
|
||||||
|
all_pr_details = []
|
||||||
|
|
||||||
|
for pr_number in sorted(all_pr_numbers, key=int):
|
||||||
|
details = get_pr_details(pr_number)
|
||||||
|
if details and not should_exclude_pr(details):
|
||||||
|
all_pr_details.append(details)
|
||||||
|
if is_dependency_update(details):
|
||||||
|
dependencies.append(details)
|
||||||
|
elif is_enhancement(details):
|
||||||
|
enhancements.append(details)
|
||||||
|
else:
|
||||||
|
bug_fixes.append(details)
|
||||||
|
|
||||||
|
# Generate release notes
|
||||||
|
output = []
|
||||||
|
|
||||||
|
if enhancements:
|
||||||
|
output.append("## 🚀 Enhancements\n")
|
||||||
|
for pr in enhancements:
|
||||||
|
output.append(format_pr_line(pr))
|
||||||
|
output.append("")
|
||||||
|
|
||||||
|
if bug_fixes:
|
||||||
|
output.append("## 🐛 Bug fixes and maintenance\n")
|
||||||
|
for pr in bug_fixes:
|
||||||
|
output.append(format_pr_line(pr))
|
||||||
|
output.append("")
|
||||||
|
|
||||||
|
if dependencies:
|
||||||
|
output.append("## ⚙️ Dependencies\n")
|
||||||
|
for pr in dependencies:
|
||||||
|
output.append(format_pr_line(pr))
|
||||||
|
output.append("")
|
||||||
|
|
||||||
|
# Find new contributors (GitHub-accurate check using merged PRs before tag date)
|
||||||
|
new_contributors = get_new_contributors(all_pr_details, last_tag)
|
||||||
|
if new_contributors:
|
||||||
|
output.append("## New Contributors\n")
|
||||||
|
for author, url in new_contributors:
|
||||||
|
# Find first PR URL for this contributor
|
||||||
|
first_pr_url = url
|
||||||
|
for pr in all_pr_details:
|
||||||
|
if pr.get("author", {}).get("login") == author:
|
||||||
|
first_pr_url = pr.get("url", url)
|
||||||
|
break
|
||||||
|
output.append(f"- @{author} made their first contribution in {first_pr_url}")
|
||||||
|
output.append("")
|
||||||
|
|
||||||
|
# Add full changelog link
|
||||||
|
output.append(
|
||||||
|
f"**Full Changelog**: https://github.com/meshtastic/firmware/compare/{last_tag}...v{new_version}"
|
||||||
|
)
|
||||||
|
|
||||||
|
print("\n".join(output))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -54,6 +54,7 @@ build_flags = -Wno-missing-field-initializers
|
|||||||
-DMESHTASTIC_EXCLUDE_HEALTH_TELEMETRY=1
|
-DMESHTASTIC_EXCLUDE_HEALTH_TELEMETRY=1
|
||||||
-DMESHTASTIC_EXCLUDE_POWERSTRESS=1 ; exclude power stress test module from main firmware
|
-DMESHTASTIC_EXCLUDE_POWERSTRESS=1 ; exclude power stress test module from main firmware
|
||||||
-DMESHTASTIC_EXCLUDE_GENERIC_THREAD_MODULE=1
|
-DMESHTASTIC_EXCLUDE_GENERIC_THREAD_MODULE=1
|
||||||
|
-DMESHTASTIC_EXCLUDE_POWERMON=1
|
||||||
-D MAX_THREADS=40 ; As we've split modules, we have more threads to manage
|
-D MAX_THREADS=40 ; As we've split modules, we have more threads to manage
|
||||||
#-DBUILD_EPOCH=$UNIX_TIME ; set in platformio-custom.py now
|
#-DBUILD_EPOCH=$UNIX_TIME ; set in platformio-custom.py now
|
||||||
#-D OLED_PL=1
|
#-D OLED_PL=1
|
||||||
@@ -118,7 +119,7 @@ lib_deps =
|
|||||||
[device-ui_base]
|
[device-ui_base]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master
|
||||||
https://github.com/meshtastic/device-ui/archive/272defcb35651461830ebfd1b39c9167c8f49317.zip
|
https://github.com/meshtastic/device-ui/archive/12f8cddc1e2908e1988da21e3500c695668e8d92.zip
|
||||||
|
|
||||||
; Common libs for environmental measurements in telemetry module
|
; Common libs for environmental measurements in telemetry module
|
||||||
[environmental_base]
|
[environmental_base]
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ template <typename T> bool LR11x0Interface<T>::reconfigure()
|
|||||||
return RADIOLIB_ERR_NONE;
|
return RADIOLIB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void INTERRUPT_ATTR LR11x0Interface<T>::disableInterrupt()
|
template <typename T> void LR11x0Interface<T>::disableInterrupt()
|
||||||
{
|
{
|
||||||
lora.clearIrqAction();
|
lora.clearIrqAction();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ bool RF95Interface::init()
|
|||||||
return res == RADIOLIB_ERR_NONE;
|
return res == RADIOLIB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void INTERRUPT_ATTR RF95Interface::disableInterrupt()
|
void RF95Interface::disableInterrupt()
|
||||||
{
|
{
|
||||||
lora->clearDio0Action();
|
lora->clearDio0Action();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ template <typename T> bool SX126xInterface<T>::reconfigure()
|
|||||||
return RADIOLIB_ERR_NONE;
|
return RADIOLIB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void INTERRUPT_ATTR SX126xInterface<T>::disableInterrupt()
|
template <typename T> void SX126xInterface<T>::disableInterrupt()
|
||||||
{
|
{
|
||||||
lora.clearDio1Action();
|
lora.clearDio1Action();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ template <typename T> bool SX128xInterface<T>::reconfigure()
|
|||||||
return RADIOLIB_ERR_NONE;
|
return RADIOLIB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void INTERRUPT_ATTR SX128xInterface<T>::disableInterrupt()
|
template <typename T> void SX128xInterface<T>::disableInterrupt()
|
||||||
{
|
{
|
||||||
lora.clearDio1Action();
|
lora.clearDio1Action();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -313,11 +313,11 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread
|
|||||||
{
|
{
|
||||||
PhoneAPI::onNowHasData(fromRadioNum);
|
PhoneAPI::onNowHasData(fromRadioNum);
|
||||||
|
|
||||||
|
#ifdef DEBUG_NIMBLE_NOTIFY
|
||||||
|
|
||||||
int currentNotifyCount = notifyCount.fetch_add(1);
|
int currentNotifyCount = notifyCount.fetch_add(1);
|
||||||
|
|
||||||
uint8_t cc = bleServer->getConnectedCount();
|
uint8_t cc = bleServer->getConnectedCount();
|
||||||
|
|
||||||
#ifdef DEBUG_NIMBLE_NOTIFY
|
|
||||||
// This logging slows things down when there are lots of packets going to the phone, like initial connection:
|
// This logging slows things down when there are lots of packets going to the phone, like initial connection:
|
||||||
LOG_DEBUG("BLE notify(%d) fromNum: %d connections: %d", currentNotifyCount, fromRadioNum, cc);
|
LOG_DEBUG("BLE notify(%d) fromNum: %d connections: %d", currentNotifyCount, fromRadioNum, cc);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -27,6 +27,6 @@ build_flags =
|
|||||||
|
|
||||||
lib_deps = ${esp32s3_base.lib_deps}
|
lib_deps = ${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
# renovate: datasource=custom.pio depName=PCA9557-arduino packageName=maxpromer/library/PCA9557-arduino
|
# renovate: datasource=custom.pio depName=PCA9557-arduino packageName=maxpromer/library/PCA9557-arduino
|
||||||
maxpromer/PCA9557-arduino@1.0.0
|
maxpromer/PCA9557-arduino@1.0.0
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
|
|
||||||
[env:crowpanel-esp32s3-4-epaper]
|
[env:crowpanel-esp32s3-4-epaper]
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
@@ -56,7 +56,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
|
|
||||||
[env:crowpanel-esp32s3-2-epaper]
|
[env:crowpanel-esp32s3-2-epaper]
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
@@ -86,4 +86,4 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
upload_speed = 115200
|
upload_speed = 115200
|
||||||
|
|
||||||
[env:heltec-vision-master-e213-inkhud]
|
[env:heltec-vision-master-e213-inkhud]
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/448c8538129fde3d02a7cb5e6fc81971ad92547f.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
upload_speed = 115200
|
upload_speed = 115200
|
||||||
|
|
||||||
[env:heltec-vision-master-e290-inkhud]
|
[env:heltec-vision-master-e290-inkhud]
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
upload_speed = 115200
|
upload_speed = 115200
|
||||||
|
|
||||||
[env:heltec-wireless-paper-inkhud]
|
[env:heltec-wireless-paper-inkhud]
|
||||||
|
|||||||
@@ -26,5 +26,5 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
upload_speed = 115200
|
upload_speed = 115200
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2
|
# renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2
|
||||||
zinggjm/GxEPD2@1.6.4
|
zinggjm/GxEPD2@1.6.5
|
||||||
# renovate: datasource=git-refs depName=CSE_Touch packageName=https://github.com/CIRCUITSTATE/CSE_Touch gitBranch=main
|
# renovate: datasource=git-refs depName=CSE_Touch packageName=https://github.com/CIRCUITSTATE/CSE_Touch gitBranch=main
|
||||||
https://github.com/CIRCUITSTATE/CSE_Touch/archive/b44f23b6f870b848f1fbe453c190879bc6cfaafa.zip
|
https://github.com/CIRCUITSTATE/CSE_Touch/archive/b44f23b6f870b848f1fbe453c190879bc6cfaafa.zip
|
||||||
# renovate: datasource=github-tags depName=CSE_CST328 packageName=CIRCUITSTATE/CSE_CST328
|
# renovate: datasource=github-tags depName=CSE_CST328 packageName=CIRCUITSTATE/CSE_CST328
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ build_flags =
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32s3_base.lib_deps}
|
${esp32s3_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
|
|
||||||
[env:tlora-t3s3-epaper-inkhud]
|
[env:tlora-t3s3-epaper-inkhud]
|
||||||
extends = esp32s3_base, inkhud
|
extends = esp32s3_base, inkhud
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
# renovate: datasource=custom.pio depName=nRF52_PWM packageName=khoih-prog/library/nRF52_PWM
|
# renovate: datasource=custom.pio depName=nRF52_PWM packageName=khoih-prog/library/nRF52_PWM
|
||||||
khoih-prog/nRF52_PWM@1.0.1
|
khoih-prog/nRF52_PWM@1.0.1
|
||||||
;upload_protocol = fs
|
;upload_protocol = fs
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
|
|
||||||
[env:heltec-mesh-pocket-5000-inkhud]
|
[env:heltec-mesh-pocket-5000-inkhud]
|
||||||
extends = nrf52840_base, inkhud
|
extends = nrf52840_base, inkhud
|
||||||
@@ -101,7 +101,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
|
|
||||||
[env:heltec-mesh-pocket-10000-inkhud]
|
[env:heltec-mesh-pocket-10000-inkhud]
|
||||||
extends = nrf52840_base, inkhud
|
extends = nrf52840_base, inkhud
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ lib_deps =
|
|||||||
# renovate: datasource=git-refs depName=NMIoT-meshsolar packageName=https://github.com/NMIoT/meshsolar gitBranch=main
|
# renovate: datasource=git-refs depName=NMIoT-meshsolar packageName=https://github.com/NMIoT/meshsolar gitBranch=main
|
||||||
https://github.com/NMIoT/meshsolar/archive/dfc5330dad443982e6cdd37a61d33fc7252f468b.zip
|
https://github.com/NMIoT/meshsolar/archive/dfc5330dad443982e6cdd37a61d33fc7252f468b.zip
|
||||||
# renovate: datasource=custom.pio depName=ArduinoJson packageName=bblanchon/library/ArduinoJson
|
# renovate: datasource=custom.pio depName=ArduinoJson packageName=bblanchon/library/ArduinoJson
|
||||||
bblanchon/ArduinoJson@6.21.4
|
bblanchon/ArduinoJson@6.21.5
|
||||||
|
|
||||||
[env:heltec-mesh-solar]
|
[env:heltec-mesh-solar]
|
||||||
custom_meshtastic_hw_model = 108
|
custom_meshtastic_hw_model = 108
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlin
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds
|
; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ lib_deps =
|
|||||||
# renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main
|
# renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main
|
||||||
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
||||||
# renovate: datasource=custom.pio depName=ArduinoJson packageName=bblanchon/library/ArduinoJson
|
# renovate: datasource=custom.pio depName=ArduinoJson packageName=bblanchon/library/ArduinoJson
|
||||||
bblanchon/ArduinoJson@6.21.4
|
bblanchon/ArduinoJson@6.21.5
|
||||||
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds
|
; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds
|
||||||
;upload_protocol = jlink
|
;upload_protocol = jlink
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_w
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
|
|
||||||
[env:seeed_wio_tracker_L1_eink-inkhud]
|
[env:seeed_wio_tracker_L1_eink-inkhud]
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/t-echo>
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master
|
||||||
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
|
https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip
|
||||||
# renovate: datasource=custom.pio depName=SensorLib packageName=lewisxhe/library/SensorLib
|
# renovate: datasource=custom.pio depName=SensorLib packageName=lewisxhe/library/SensorLib
|
||||||
lewisxhe/SensorLib@0.3.3
|
lewisxhe/SensorLib@0.3.3
|
||||||
;upload_protocol = fs
|
;upload_protocol = fs
|
||||||
|
|||||||
Reference in New Issue
Block a user