summaryrefslogtreecommitdiff
path: root/.pio/libdeps/esp32-s3-n16r8/RF24
diff options
context:
space:
mode:
authorkrolyxon <me@krolyxon.com>2026-06-08 23:12:15 +0530
committerkrolyxon <me@krolyxon.com>2026-06-08 23:12:15 +0530
commit8a4d103196312b8a18afc0a2ba0fc13ff1a0b180 (patch)
treea92424ac65fbdb93702ea8c44a5c52c9fd66e28c /.pio/libdeps/esp32-s3-n16r8/RF24
parent1d557527be495c59bbc07f194d903b1cec1780d3 (diff)
remove .pio
Diffstat (limited to '.pio/libdeps/esp32-s3-n16r8/RF24')
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/.clang-format156
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/.clang-tidy154
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/.gitattributes31
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/.gitignore56
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/.piopm1
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/.readthedocs.yaml32
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/CHANGELOG.md1708
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/COMMON_ISSUES.md175
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/CONTRIBUTING.md16
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/LICENSE339
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/README.md16
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/RF24.cpp2209
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/RF24.h2568
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/RF24_config.h248
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/cspell.config.yaml319
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/Doxyfile393
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/README.md23
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/arduino.md288
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/attiny.md81
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/atxmega.md57
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/cross_compile.md63
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/doxygen-custom.css166
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/Logo large.pngbin94683 -> 0 bytes
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/favicon.icobin4286 -> 0 bytes
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/linux_install.md152
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/main_page.md90
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/migration.md287
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/mraa.md42
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/pico_sdk.md234
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/portability.md40
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/python_wrapper.md138
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/rpi_general.md120
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/docs/using_cmake.md249
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/.clang-format145
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/AcknowledgementPayloads/AcknowledgementPayloads.ino207
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/GettingStarted/GettingStarted.ino154
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/InterruptConfigure/InterruptConfigure.ino353
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/ManualAcknowledgements/ManualAcknowledgements.ino222
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/MulticeiverDemo/MulticeiverDemo.ino194
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/StreamingData/StreamingData.ino192
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/encodeRadioDetails.ino123
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/print_details.py196
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/GettingStarted_HandlingFailures/GettingStarted_HandlingFailures.ino217
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/TransferTimeouts/TransferTimeouts.ino185
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_dyn/pingpair_dyn.ino182
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_irq/pingpair_irq.ino173
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_multi_dyn/pingpair_multi_dyn.ino252
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_sleepy/pingpair_sleepy.ino231
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/led_remote/led_remote.ino236
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/nordic_fob/nordic_fob.ino135
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/main.cpp77
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/pingpair_maple.ino231
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/readme.md7
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/rf24ping85/rf24ping85.ino204
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/timingSearch3pin/timingSearch3pin.ino207
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/scanner/scanner.ino236
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples/scannerGraphic/scannerGraphic.ino323
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/README.md10
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/app.yaml18
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/python/main.py200
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.ino126
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.yaml13
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_1.pngbin1376364 -> 0 bytes
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_2.pngbin1238256 -> 0 bytes
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/images/pinout.jpgbin40056 -> 0 bytes
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/library.json43
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/library.properties9
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/nRF24L01.h139
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/nurfile287
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/printf.h46
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/ATTiny/RF24_arch_config.h53
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/Teensy/RF24_arch_config.h34
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/RF24_arch_config.h76
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/compatibility.h36
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/gpio.h67
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/includes.h28
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/spi.h74
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/RF24_arch_config.h71
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.cpp45
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.h25
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.cpp39
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.h63
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/includes.h10
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.cpp32
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.h30
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.cpp40
-rw-r--r--.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.h68
87 files changed, 0 insertions, 16815 deletions
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/.clang-format b/.pio/libdeps/esp32-s3-n16r8/RF24/.clang-format
deleted file mode 100644
index c02cf2f..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/.clang-format
+++ /dev/null
@@ -1,156 +0,0 @@
-# See options listed at https://releases.llvm.org/12.0.1/tools/clang/docs/ClangFormatStyleOptions.html
----
-Language: Cpp
-# BasedOnStyle: WebKit
-AccessModifierOffset: -4
-AlignAfterOpenBracket: Align
-AlignConsecutiveMacros: Consecutive
-AlignConsecutiveAssignments: None
-AlignConsecutiveBitFields: None
-AlignConsecutiveDeclarations: None
-AlignEscapedNewlines: Left
-AlignOperands: DontAlign
-AlignTrailingComments: true
-AllowAllArgumentsOnNextLine: true
-AllowAllConstructorInitializersOnNextLine: true
-AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortEnumsOnASingleLine: false
-AllowShortBlocksOnASingleLine: Empty
-AllowShortCaseLabelsOnASingleLine: true
-AllowShortFunctionsOnASingleLine: All
-AllowShortLambdasOnASingleLine: All
-AllowShortIfStatementsOnASingleLine: Never
-AllowShortLoopsOnASingleLine: false
-AlwaysBreakAfterReturnType: None
-AlwaysBreakBeforeMultilineStrings: false
-AlwaysBreakTemplateDeclarations: Yes
-AttributeMacros: ["__capability", "__output", "__ununsed"]
-BinPackArguments: true
-BinPackParameters: true
-BitFieldColonSpacing: Both
-BraceWrapping:
- AfterCaseLabel: false
- AfterClass: true
- AfterControlStatement: MultiLine
- AfterEnum: true
- AfterFunction: true
- AfterNamespace: false
- AfterStruct: true
- AfterUnion: true
- AfterExternBlock: false
- BeforeCatch: true
- BeforeElse: true
- BeforeLambdaBody: false
- BeforeWhile: false
- IndentBraces: false
- SplitEmptyFunction: true
- SplitEmptyRecord: true
- SplitEmptyNamespace: true
-BreakBeforeBinaryOperators: All
-BreakBeforeConceptDeclarations: true
-BreakBeforeBraces: Custom
-BreakBeforeInheritanceComma: false
-BreakInheritanceList: BeforeColon
-BreakBeforeTernaryOperators: true
-BreakConstructorInitializersBeforeComma: false
-BreakConstructorInitializers: BeforeColon
-BreakStringLiterals: true
-ColumnLimit: 0
-# CommentPragmas are a regex pattern indicating the comment is not be touched by the formatter
-CommentPragmas: "^ Include gaurd .*"
-CompactNamespaces: false
-ConstructorInitializerAllOnOneLineOrOnePerLine: true
-ConstructorInitializerIndentWidth: 4
-ContinuationIndentWidth: 4
-Cpp11BracedListStyle: true
-DeriveLineEnding: false
-DerivePointerAlignment: false
-DisableFormat: false
-EmptyLineBeforeAccessModifier: Always
-EmptyLineAfterAccessModifier: Leave
-ExperimentalAutoDetectBinPacking: false
-FixNamespaceComments: true
-IncludeBlocks: Preserve
-IncludeCategories:
- - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
- Priority: 2
- SortPriority: 0
- CaseSensitive: false
- - Regex: '^(<|"(gtest|gmock|isl|json)/)'
- Priority: 3
- SortPriority: 0
- CaseSensitive: false
- - Regex: ".*"
- Priority: 1
- SortPriority: 0
- CaseSensitive: false
-IncludeIsMainRegex: "(Test)?$"
-IncludeIsMainSourceRegex: ""
-IndentAccessModifiers: false
-IndentCaseLabels: true
-IndentCaseBlocks: false
-IndentGotoLabels: false
-IndentPPDirectives: BeforeHash
-IndentExternBlock: AfterExternBlock
-IndentRequires: false
-IndentWidth: 4
-IndentWrappedFunctionNames: false
-InsertTrailingCommas: None
-KeepEmptyLinesAtTheStartOfBlocks: true
-MacroBlockBegin: ""
-MacroBlockEnd: ""
-MaxEmptyLinesToKeep: 1
-NamespaceIndentation: Inner
-PenaltyBreakAssignment: 2
-PenaltyBreakBeforeFirstCallParameter: 19
-PenaltyBreakComment: 300
-PenaltyBreakFirstLessLess: 120
-PenaltyBreakString: 1000
-PenaltyBreakTemplateDeclaration: 10
-PenaltyExcessCharacter: 1000000
-PenaltyReturnTypeOnItsOwnLine: 60
-PenaltyIndentedWhitespace: 0
-PointerAlignment: Left
-ReferenceAlignment: Pointer
-ReflowComments: true
-SpacesInLineCommentPrefix:
- Maximum: -1
- Minimum: 0
-ShortNamespaceLines: 0
-# Sort**** is about sorting include/using statements alphabetically
-SortIncludes: false
-SortUsingDeclarations: false
-SpaceAfterCStyleCast: false
-SpaceAfterLogicalNot: false
-SpaceAfterTemplateKeyword: false
-SpaceBeforeAssignmentOperators: true
-SpaceBeforeCaseColon: false
-SpaceBeforeCpp11BracedList: true
-SpaceBeforeCtorInitializerColon: true
-SpaceBeforeInheritanceColon: true
-SpaceBeforeParens: ControlStatements
-SpaceAroundPointerQualifiers: Default
-SpaceBeforeRangeBasedForLoopColon: true
-SpaceInEmptyBlock: false
-SpaceInEmptyParentheses: false
-SpacesBeforeTrailingComments: 1
-SpacesInAngles: false
-SpacesInConditionalStatement: false
-SpacesInContainerLiterals: false
-SpacesInCStyleCastParentheses: false
-SpacesInParentheses: false
-SpacesInSquareBrackets: false
-SpaceBeforeSquareBrackets: false
-Standard: c++11
-StatementAttributeLikeMacros: [emit]
-StatementMacros: [Q_UNUSED, QT_REQUIRE_VERSION]
-TabWidth: 4
-UseCRLF: false
-UseTab: Never
-WhitespaceSensitiveMacros:
- - PRIPSTR
- - STRINGIZE
- - PP_STRINGIZE
- - BOOST_PP_STRINGIZE
- - NS_SWIFT_NAME
- - CF_SWIFT_NAME
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/.clang-tidy b/.pio/libdeps/esp32-s3-n16r8/RF24/.clang-tidy
deleted file mode 100644
index adb03ec..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/.clang-tidy
+++ /dev/null
@@ -1,154 +0,0 @@
----
-Checks: 'clang-diagnostic-*,clang-analyzer-*,bugprone-*,-bugprone-easily-swappable-parameters,clang-diagnostics-*,clang-analyzer-*'
-WarningsAsErrors: ''
-HeaderFilterRegex: ''
-AnalyzeTemporaryDtors: false
-FormatStyle: file
-User: brendan
-CheckOptions:
- - key: bugprone-string-constructor.LargeLengthThreshold
- value: '8388608'
- - key: modernize-replace-auto-ptr.IncludeStyle
- value: llvm
- - key: bugprone-reserved-identifier.Invert
- value: 'false'
- - key: bugprone-implicit-widening-of-multiplication-result.UseCXXStaticCastsInCppSources
- value: 'true'
- - key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField
- value: 'false'
- - key: bugprone-unused-return-value.CheckedFunctions
- value: '::std::async;::std::launder;::std::remove;::std::remove_if;::std::unique;::std::unique_ptr::release;::std::basic_string::empty;::std::vector::empty;::std::back_inserter;::std::distance;::std::find;::std::find_if;::std::inserter;::std::lower_bound;::std::make_pair;::std::map::count;::std::map::find;::std::map::lower_bound;::std::multimap::equal_range;::std::multimap::upper_bound;::std::set::count;::std::set::find;::std::setfill;::std::setprecision;::std::setw;::std::upper_bound;::std::vector::at;::bsearch;::ferror;::feof;::isalnum;::isalpha;::isblank;::iscntrl;::isdigit;::isgraph;::islower;::isprint;::ispunct;::isspace;::isupper;::iswalnum;::iswprint;::iswspace;::isxdigit;::memchr;::memcmp;::strcmp;::strcoll;::strncmp;::strpbrk;::strrchr;::strspn;::strstr;::wcscmp;::access;::bind;::connect;::difftime;::dlsym;::fnmatch;::getaddrinfo;::getopt;::htonl;::htons;::iconv_open;::inet_addr;::isascii;::isatty;::mmap;::newlocale;::openat;::pathconf;::pthread_equal;::pthread_getspecific;::pthread_mutex_trylock;::readdir;::readlink;::recvmsg;::regexec;::scandir;::semget;::setjmp;::shm_open;::shmget;::sigismember;::strcasecmp;::strsignal;::ttyname'
- - key: cert-dcl16-c.NewSuffixes
- value: 'L;LL;LU;LLU'
- - key: bugprone-exception-escape.FunctionsThatShouldNotThrow
- value: ''
- - key: modernize-loop-convert.MaxCopySize
- value: '16'
- - key: bugprone-narrowing-conversions.WarnOnFloatingPointNarrowingConversion
- value: 'true'
- - key: bugprone-signed-char-misuse.CharTypdefsToIgnore
- value: ''
- - key: bugprone-argument-comment.CommentStringLiterals
- value: '0'
- - key: bugprone-narrowing-conversions.PedanticMode
- value: 'false'
- - key: bugprone-sizeof-expression.WarnOnSizeOfConstant
- value: 'true'
- - key: bugprone-assert-side-effect.IgnoredFunctions
- value: __builtin_expect
- - key: bugprone-argument-comment.CommentBoolLiterals
- value: '0'
- - key: bugprone-argument-comment.CommentUserDefinedLiterals
- value: '0'
- - key: cert-str34-c.DiagnoseSignedUnsignedCharComparisons
- value: 'false'
- - key: bugprone-narrowing-conversions.WarnWithinTemplateInstantiation
- value: 'false'
- - key: cert-err33-c.CheckedFunctions
- value: '::aligned_alloc;::asctime_s;::at_quick_exit;::atexit;::bsearch;::bsearch_s;::btowc;::c16rtomb;::c32rtomb;::calloc;::clock;::cnd_broadcast;::cnd_init;::cnd_signal;::cnd_timedwait;::cnd_wait;::ctime_s;::fclose;::fflush;::fgetc;::fgetpos;::fgets;::fgetwc;::fopen;::fopen_s;::fprintf;::fprintf_s;::fputc;::fputs;::fputwc;::fputws;::fread;::freopen;::freopen_s;::fscanf;::fscanf_s;::fseek;::fsetpos;::ftell;::fwprintf;::fwprintf_s;::fwrite;::fwscanf;::fwscanf_s;::getc;::getchar;::getenv;::getenv_s;::gets_s;::getwc;::getwchar;::gmtime;::gmtime_s;::localtime;::localtime_s;::malloc;::mbrtoc16;::mbrtoc32;::mbsrtowcs;::mbsrtowcs_s;::mbstowcs;::mbstowcs_s;::memchr;::mktime;::mtx_init;::mtx_lock;::mtx_timedlock;::mtx_trylock;::mtx_unlock;::printf_s;::putc;::putwc;::raise;::realloc;::remove;::rename;::scanf;::scanf_s;::setlocale;::setvbuf;::signal;::snprintf;::snprintf_s;::sprintf;::sprintf_s;::sscanf;::sscanf_s;::strchr;::strerror_s;::strftime;::strpbrk;::strrchr;::strstr;::strtod;::strtof;::strtoimax;::strtok;::strtok_s;::strtol;::strtold;::strtoll;::strtoul;::strtoull;::strtoumax;::strxfrm;::swprintf;::swprintf_s;::swscanf;::swscanf_s;::thrd_create;::thrd_detach;::thrd_join;::thrd_sleep;::time;::timespec_get;::tmpfile;::tmpfile_s;::tmpnam;::tmpnam_s;::tss_create;::tss_get;::tss_set;::ungetc;::ungetwc;::vfprintf;::vfprintf_s;::vfscanf;::vfscanf_s;::vfwprintf;::vfwprintf_s;::vfwscanf;::vfwscanf_s;::vprintf_s;::vscanf;::vscanf_s;::vsnprintf;::vsnprintf_s;::vsprintf;::vsprintf_s;::vsscanf;::vsscanf_s;::vswprintf;::vswprintf_s;::vswscanf;::vswscanf_s;::vwprintf_s;::vwscanf;::vwscanf_s;::wcrtomb;::wcschr;::wcsftime;::wcspbrk;::wcsrchr;::wcsrtombs;::wcsrtombs_s;::wcsstr;::wcstod;::wcstof;::wcstoimax;::wcstok;::wcstok_s;::wcstol;::wcstold;::wcstoll;::wcstombs;::wcstombs_s;::wcstoul;::wcstoull;::wcstoumax;::wcsxfrm;::wctob;::wctrans;::wctype;::wmemchr;::wprintf_s;::wscanf;::wscanf_s;'
- - key: bugprone-suspicious-string-compare.WarnOnLogicalNotComparison
- value: 'false'
- - key: google-readability-braces-around-statements.ShortStatementLines
- value: '1'
- - key: bugprone-reserved-identifier.AllowedIdentifiers
- value: ''
- - key: bugprone-signal-handler.AsyncSafeFunctionSet
- value: POSIX
- - key: bugprone-suspicious-string-compare.WarnOnImplicitComparison
- value: 'true'
- - key: bugprone-argument-comment.CommentNullPtrs
- value: '0'
- - key: bugprone-narrowing-conversions.WarnOnIntegerToFloatingPointNarrowingConversion
- value: 'true'
- - key: bugprone-argument-comment.StrictMode
- value: '0'
- - key: bugprone-misplaced-widening-cast.CheckImplicitCasts
- value: 'false'
- - key: bugprone-suspicious-missing-comma.RatioThreshold
- value: '0.200000'
- - key: modernize-loop-convert.MinConfidence
- value: reasonable
- - key: bugprone-unhandled-self-assignment.WarnOnlyIfThisHasSuspiciousField
- value: 'true'
- - key: google-readability-namespace-comments.ShortNamespaceLines
- value: '10'
- - key: google-readability-namespace-comments.SpacesBeforeComments
- value: '2'
- - key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic
- value: 'true'
- - key: bugprone-argument-comment.IgnoreSingleArgument
- value: '0'
- - key: bugprone-suspicious-string-compare.StringCompareLikeFunctions
- value: ''
- - key: bugprone-narrowing-conversions.WarnOnEquivalentBitWidth
- value: 'true'
- - key: bugprone-sizeof-expression.WarnOnSizeOfIntegerExpression
- value: 'false'
- - key: bugprone-assert-side-effect.CheckFunctionCalls
- value: 'false'
- - key: bugprone-narrowing-conversions.IgnoreConversionFromTypes
- value: ''
- - key: bugprone-string-constructor.StringNames
- value: '::std::basic_string;::std::basic_string_view'
- - key: bugprone-assert-side-effect.AssertMacros
- value: assert,NSAssert,NSCAssert
- - key: bugprone-exception-escape.IgnoredExceptions
- value: ''
- - key: bugprone-signed-char-misuse.DiagnoseSignedUnsignedCharComparisons
- value: 'true'
- - key: llvm-qualified-auto.AddConstToQualified
- value: 'false'
- - key: bugprone-narrowing-conversions.WarnOnIntegerNarrowingConversion
- value: 'true'
- - key: modernize-loop-convert.NamingStyle
- value: CamelCase
- - key: bugprone-suspicious-include.ImplementationFileExtensions
- value: 'c;cc;cpp;cxx'
- - key: bugprone-suspicious-missing-comma.SizeThreshold
- value: '5'
- - key: bugprone-suspicious-include.HeaderFileExtensions
- value: ';h;hh;hpp;hxx'
- - key: google-readability-function-size.StatementThreshold
- value: '800'
- - key: llvm-else-after-return.WarnOnConditionVariables
- value: 'false'
- - key: bugprone-argument-comment.CommentCharacterLiterals
- value: '0'
- - key: bugprone-argument-comment.CommentIntegerLiterals
- value: '0'
- - key: bugprone-stringview-nullptr.IncludeStyle
- value: llvm
- - key: bugprone-sizeof-expression.WarnOnSizeOfCompareToConstant
- value: 'true'
- - key: modernize-pass-by-value.IncludeStyle
- value: llvm
- - key: bugprone-reserved-identifier.AggressiveDependentMemberLookup
- value: 'false'
- - key: bugprone-sizeof-expression.WarnOnSizeOfThis
- value: 'true'
- - key: bugprone-string-constructor.WarnOnLargeLength
- value: 'true'
- - key: bugprone-too-small-loop-variable.MagnitudeBitsUpperLimit
- value: '16'
- - key: bugprone-argument-comment.CommentFloatLiterals
- value: '0'
- - key: modernize-use-nullptr.NullMacros
- value: 'NULL'
- - key: bugprone-dangling-handle.HandleClasses
- value: 'std::basic_string_view;std::experimental::basic_string_view'
- - key: bugprone-dynamic-static-initializers.HeaderFileExtensions
- value: ';h;hh;hpp;hxx'
- - key: bugprone-suspicious-enum-usage.StrictMode
- value: 'false'
- - key: bugprone-implicit-widening-of-multiplication-result.IncludeStyle
- value: llvm
- - key: bugprone-suspicious-missing-comma.MaxConcatenatedTokens
- value: '5'
- - key: bugprone-implicit-widening-of-multiplication-result.UseCXXHeadersInCppSources
- value: 'true'
- - key: llvm-else-after-return.WarnOnUnfixable
- value: 'false'
- - key: bugprone-not-null-terminated-result.WantToUseSafeFunctions
- value: 'true'
-...
-
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/.gitattributes b/.pio/libdeps/esp32-s3-n16r8/RF24/.gitattributes
deleted file mode 100644
index fd43087..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/.gitattributes
+++ /dev/null
@@ -1,31 +0,0 @@
-# Set the default behavior, in case people don't have core.autocrlf set.
-* text=auto
-
-# Explicitly declare text files you want to always be normalized and converted
-# to native line endings on checkout.
-*.py text eol=lf
-*.rst text eol=lf
-*.sh text eol=lf
-*.h text eol=lf
-*.cpp text eol=lf
-*.c text eol=lf
-configure text eol=lf
-.yaml text eol=lf
-*.yml text eol=lf
-*.md text eol=lf
-*.txt text eol=lf
-*.json text eol=lf
-*.properties text eol=lf
-LICENSE text eol=lf
-nurfile text eol=lf
-.gitignore text eol=lf
-.gitattributes text eol=lf
-.clang-format text eol=lf
-.clang-tidy text eol=lf
-Makefile text eol=lf
-*.svg text eol=lf
-*.ino text eol=lf
-*.dot text eol=lf
-*.cmake text eol=lf
-*.css text eol=lf
-Doxyfile text eol=lf
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/.gitignore b/.pio/libdeps/esp32-s3-n16r8/RF24/.gitignore
deleted file mode 100644
index 11a99de..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/.gitignore
+++ /dev/null
@@ -1,56 +0,0 @@
-*.bak
-*.o
-.*.swp
-*.orig
-.swp
-output/
-ojam/
-out/
-16000000/
-8000000/
-out_native/
-version.h
-Session.vim
-*.so
-*.so.*
-*.dylib
-*.dylib.*
-.DS_Store
-Makefile.inc
-utility/includes.h
-!examples_linux/
-examples_linux/*
-!examples_linux/**/
-!examples_linux/*.cpp
-!examples_linux/*.py
-!examples_linux/**/*.cpp
-!examples_linux/Makefile
-!examples_linux/**/Makefile
-!examples_linux/CMakeLists.txt
-.directory
-.idea
-docs/html/
-docs/latex/
-docs/*/xml/
-docs/_build/
-doxygenAction
-.vscode/
-__pycache__/
-*env
-*.pyc
-*.egg*
-build/
-*CMakeUserPresets*.json
-*.tar.gz
-
-# Cmake build-in-source generated stuff
-CMakeCache.txt
-CPackConfig.cmake
-CPackSourceConfig.cmake
-CMakeFiles
-DEBIAN
-cmake_install.cmake
-compile_commands.json
-utility/Makefile
-# Makefile is modified when `cmake .` is run
-# Makefile # preserve old/traditional build system
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/.piopm b/.pio/libdeps/esp32-s3-n16r8/RF24/.piopm
deleted file mode 100644
index f8ff9df..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/.piopm
+++ /dev/null
@@ -1 +0,0 @@
-{"type": "library", "name": "RF24", "version": "1.6.0", "spec": {"owner": "nrf24", "id": 433, "name": "RF24", "requirements": null, "uri": null}} \ No newline at end of file
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/.readthedocs.yaml b/.pio/libdeps/esp32-s3-n16r8/RF24/.readthedocs.yaml
deleted file mode 100644
index 6935517..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/.readthedocs.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-# .readthedocs.yaml
-# Read the Docs configuration file
-# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
-
-# Required
-version: 2
-
-build:
- os: "ubuntu-24.04"
- # apt_packages:
- # - libclang1-12
- # - libclang-cpp12
- tools:
- python: "3"
- commands:
- # Install doxygen from source distributions (conda forge does not keep up-to-date doxygen releases)
- - >
- DOXYGEN_VERSION="1.15.0" &&
- RELEASE_TITLE=$(echo ${DOXYGEN_VERSION} | tr '.' '_') &&
- mkdir .doxygen && cd .doxygen &&
- curl -L "https://github.com/doxygen/doxygen/releases/download/Release_${RELEASE_TITLE}/doxygen-${DOXYGEN_VERSION}.linux.bin.tar.gz" --output doxygen.tar.gz &&
- gunzip doxygen.tar.gz &&
- tar xf doxygen.tar &&
- mv doxygen-$DOXYGEN_VERSION/bin/doxygen ./
- # get lib version & overwrite Doxyfile values
- - python3 .github/doxygen.py
- # run doxygen
- - cd docs && ../.doxygen/doxygen
- # copy output to RTD output path for HTML files
- - ls -R docs/html/
- - mkdir -p ${READTHEDOCS_OUTPUT}
- - mv docs/html/ "${READTHEDOCS_OUTPUT}"
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/CHANGELOG.md b/.pio/libdeps/esp32-s3-n16r8/RF24/CHANGELOG.md
deleted file mode 100644
index cae933b..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/CHANGELOG.md
+++ /dev/null
@@ -1,1708 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-<!-- markdownlint-disable MD024 -->
-
-## [1.6.0] - 2026-04-08
-
-### <!-- 4 --> 🛠️ Fixed
-
-- NRF54l15 support by \@TMRh20 in [#1065](https://github.com/nRF24/RF24/pull/1065)
-- Use explicit `nRF24L01::` namespace in RF24.cpp by \@Copilot in [#1069](https://github.com/nRF24/RF24/pull/1069)
-
-### <!-- 6 --> 📦 Dependency updates
-
-- Bump actions/checkout from 4 to 5 by \@dependabot[bot] in [#1043](https://github.com/nRF24/RF24/pull/1043)
-- Bump actions/setup-node from 4 to 5 by \@dependabot[bot] in [#1044](https://github.com/nRF24/RF24/pull/1044)
-- Bump actions/setup-node from 5 to 6 by \@dependabot[bot] in [#1048](https://github.com/nRF24/RF24/pull/1048)
-- Bump actions/checkout from 5 to 6 by \@dependabot[bot] in [#1049](https://github.com/nRF24/RF24/pull/1049)
-
-### <!-- 8 --> 📝 Documentation
-
-- Update build badges in README by \@2bndy5 in [`a0f7161`](https://github.com/nRF24/RF24/commit/a0f7161a42cda53da61c7060202be71d0852ecc4)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Use nushell as a task runner by \@2bndy5 in [#1038](https://github.com/nRF24/RF24/pull/1038)
-- Revise CI by \@2bndy5 in [#1050](https://github.com/nRF24/RF24/pull/1050)
-- Found and converted CRLF to LF by \@2bndy5 in [`2a8f554`](https://github.com/nRF24/RF24/commit/2a8f5541afae3228b748285785d6e1ea2a077c41)
-- Only calculate compile size deltas in PR by \@2bndy5 in [`afb7a4f`](https://github.com/nRF24/RF24/commit/afb7a4f5cb67b3fa35c722e4ec29787858dd7b8c)
-- Convert CRLF to LF by \@2bndy5 in [`74b300d`](https://github.com/nRF24/RF24/commit/74b300d31f4d79e6570f1a8a7ed473d6b059b4a1)
-- Arduino Uno Q Preliminary Example by \@TMRh20 in [#1054](https://github.com/nRF24/RF24/pull/1054)
-- Modify call to reusable PIO workflow by \@2bndy5 in [`6144bba`](https://github.com/nRF24/RF24/commit/6144bba6e3d26f2dc661616ef3311c8a6852114e)
-- Big bug fix: Disable interrupts by default by \@TMRh20 in [#1062](https://github.com/nRF24/RF24/pull/1062)
-- Enhanced Error Handling by \@TMRh20 in [#1064](https://github.com/nRF24/RF24/pull/1064)
-- Namespace nRF24L01.h defines to avoid name collisions by \@Copilot in [#1066](https://github.com/nRF24/RF24/pull/1066)
-
-[1.6.0]: https://github.com/nRF24/RF24/compare/v1.5.0...v1.6.0
-
-Full commit diff: [`v1.5.0...v1.6.0`][1.6.0]
-
-## New Contributors
-
-- \@Copilot made their first contribution in [#1069](https://github.com/nRF24/RF24/pull/1069)
-
-## [1.5.0] - 2025-05-04
-
-### <!-- 1 --> 🚀 Added
-
-- Publicly expose `ce()` for advanced uses. by \@2bndy5 in [#1031](https://github.com/nRF24/RF24/pull/1031)
-- Add required delay for Linux by \@TMRh20 in [#1034](https://github.com/nRF24/RF24/pull/1034)
-- Expose status byte in public API by \@2bndy5 in [#1032](https://github.com/nRF24/RF24/pull/1032)
-- Migrate to `stopListening(txAddress)` from `openWritingPipe()` by \@2bndy5 in [#1030](https://github.com/nRF24/RF24/pull/1030)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Set `/dev/gpiochip0` as default by \@2bndy5 in [#1018](https://github.com/nRF24/RF24/pull/1018)
-- Pipe0 fix by \@TMRh20 in [#1029](https://github.com/nRF24/RF24/pull/1029)
-- Fix for Dynamic Payloads causing apparent Radio Failures by \@TMRh20 in [#1036](https://github.com/nRF24/RF24/pull/1036)
-
-### <!-- 8 --> 📝 Documentation
-
-- Update doc comment for default linux gpiochip by \@2bndy5 in [#1025](https://github.com/nRF24/RF24/pull/1025)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Bump BCM2835 lib to v1.75 by \@2bndy5 in [#1019](https://github.com/nRF24/RF24/pull/1019)
-- Revert "Add required delay for Linux " by \@TMRh20 in [#1035](https://github.com/nRF24/RF24/pull/1035)
-- Use shared pin FD cache by \@2bndy5 in [#1027](https://github.com/nRF24/RF24/pull/1027)
-- Bump version to v1.5.0 by \@2bndy5 in [`beb8ffe`](https://github.com/nRF24/RF24/commit/beb8ffebc5be0f5470fb08c851f941d0c70a45e0)
-
-[1.5.0]: https://github.com/nRF24/RF24/compare/v1.4.11...v1.5.0
-
-Full commit diff: [`v1.4.11...v1.5.0`][1.5.0]
-
-## [1.4.11] - 2025-01-10
-
-### <!-- 1 --> 🚀 Added
-
-- Use enum to return precise FIFO state by \@2bndy5 in [#1009](https://github.com/nRF24/RF24/pull/1009)
-- Make `available(pipe)` depend on `available(void)` by \@2bndy5 in [#1007](https://github.com/nRF24/RF24/pull/1007)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fixes for STM32 by \@2bndy5 in [#1011](https://github.com/nRF24/RF24/pull/1011)
-- Init `failureDetected` by \@2bndy5 in [#1016](https://github.com/nRF24/RF24/pull/1016)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Adjustments to CHANGELOG by \@2bndy5 in [`8aa7103`](https://github.com/nRF24/RF24/commit/8aa71035ae3dd10de35865a894082f10a9c51027)
-- Change comment in example by \@2bndy5 in [`80e7f13`](https://github.com/nRF24/RF24/commit/80e7f137ae4caf0df4889b5499c22857019a328a)
-- Bump version to v1.4.11 by \@2bndy5 in [`6f3da43`](https://github.com/nRF24/RF24/commit/6f3da43c70cdfa666ec4d3de9b355c4e2fea8666)
-
-[1.4.11]: https://github.com/nRF24/RF24/compare/v1.4.10...v1.4.11
-
-Full commit diff: [`v1.4.10...v1.4.11`][1.4.11]
-
-## [1.4.10] - 2024-10-06
-
-### <!-- 1 --> 🚀 Added
-
-- Add ebyte manual for ML01DP5 to datasheets by \@2bndy5 in [#996](https://github.com/nRF24/RF24/pull/996)
-- Add pyproject.toml and update docs by \@2bndy5 in [#1001](https://github.com/nRF24/RF24/pull/1001)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Remove useless `ce()` call by \@2bndy5 in [#987](https://github.com/nRF24/RF24/pull/987)
-- Remove sphinx sources and update RTD config by \@2bndy5 in [#1003](https://github.com/nRF24/RF24/pull/1003)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix doc typo by \@2bndy5 in [`81348ad`](https://github.com/nRF24/RF24/commit/81348ad9b100abf252de6f287a5855c18c0c9cc8)
-- Fix spelling by \@2bndy5 in [#998](https://github.com/nRF24/RF24/pull/998)
-- Fix some linting errors noted by clang-tidy by \@2bndy5 in [#999](https://github.com/nRF24/RF24/pull/999)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Change SERIAL_DEBUG into RF24_DEBUG by \@2bndy5 in [#981](https://github.com/nRF24/RF24/pull/981)
-- Update py examples' comment about pin numbers by \@2bndy5 in [`2344282`](https://github.com/nRF24/RF24/commit/234428209ae9cc90d38a2288c2d5645a7ead4cef)
-- Update doxygen CSS by \@2bndy5 in [#982](https://github.com/nRF24/RF24/pull/982)
-- Separate 2 problems' answers in COMMON_ISSUES.md by \@2bndy5 in [#984](https://github.com/nRF24/RF24/pull/984)
-- Migrate issue templates into forms by \@2bndy5 in [#985](https://github.com/nRF24/RF24/pull/985)
-- Refactor some SPI transactions by \@2bndy5 in [#988](https://github.com/nRF24/RF24/pull/988)
-- Bump version to v1.4.10 by \@2bndy5 in [`5bb22e2`](https://github.com/nRF24/RF24/commit/5bb22e2dbab31dedd677defc0007c2f0e7cd7f11)
-
-[1.4.10]: https://github.com/nRF24/RF24/compare/v1.4.9...v1.4.10
-
-Full commit diff: [`v1.4.9...v1.4.10`][1.4.10]
-
-## [1.4.9] - 2024-06-11
-
-### <!-- 1 --> 🚀 Added
-
-- Add delay to manualAcknowledgements example by \@TMRh20 in [#953](https://github.com/nRF24/RF24/pull/953)
-- Separate ISR handling from IRQ processing by \@2bndy5 in [#956](https://github.com/nRF24/RF24/pull/956)
-- Promiscuous scanners by \@2bndy5 in [#955](https://github.com/nRF24/RF24/pull/955)
-- Update SPIDEV driver for Character Device v2 ABI; cache FDs by \@2bndy5 in [#959](https://github.com/nRF24/RF24/pull/959)
-- IRQ support using Linux kernel Character Device + Posix threads by \@2bndy5 in [#961](https://github.com/nRF24/RF24/pull/961)
-- Add link to RF24G library by \@TMRh20 in [#964](https://github.com/nRF24/RF24/pull/964)
-- Revise MRAA's GPIO implementation by \@2bndy5 in [#966](https://github.com/nRF24/RF24/pull/966)
-- Update python wrapper/examples/doc by \@2bndy5 in [#967](https://github.com/nRF24/RF24/pull/967)
-
-### <!-- 2 --> 🚫 Deprecated
-
-- Update linux installer docs by \@TMRh20 in [#957](https://github.com/nRF24/RF24/pull/957)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Wrap MRAA lib's `Gpio::isr()` for IRQ support by \@2bndy5 in [#970](https://github.com/nRF24/RF24/pull/970)
-- Disable auto-detect driver and default to SPIDEV by \@2bndy5 in [#973](https://github.com/nRF24/RF24/pull/973)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- GPIO changes (RPi5 support) by \@TMRh20 in [#942](https://github.com/nRF24/RF24/pull/942)
-- Fix for SPIDEV & MRAA: delayMicroseconds() by \@TMRh20 in [#952](https://github.com/nRF24/RF24/pull/952)
-- Fix for pigpio delayMicroseconds by \@TMRh20 in [#954](https://github.com/nRF24/RF24/pull/954)
-- Fix scanner.py; draw 1 space (not 2) after channel label by \@2bndy5 in [`9d0aa8d`](https://github.com/nRF24/RF24/commit/9d0aa8d3b0f46a99105d15e0ef7e3284d6b5bdf3)
-
-### <!-- 6 --> 📦 Dependency updates
-
-- Bump actions/checkout from 3 to 4 by \@dependabot[bot] in [#941](https://github.com/nRF24/RF24/pull/941)
-
-### <!-- 8 --> 📝 Documentation
-
-- Modify Main docs page by \@TMRh20 in [#951](https://github.com/nRF24/RF24/pull/951)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update clang format by \@2bndy5 in [#940](https://github.com/nRF24/RF24/pull/940)
-- Byte alignment/packing mismatches by \@TMRh20 in [#945](https://github.com/nRF24/RF24/pull/945)
-- Update COMMON_ISSUES re: write() function by \@TMRh20 in [#947](https://github.com/nRF24/RF24/pull/947)
-- TestRPD by \@TMRh20 in [#948](https://github.com/nRF24/RF24/pull/948)
-- Update MRAA timer functions by \@TMRh20 in [#950](https://github.com/nRF24/RF24/pull/950)
-- Cache gpio chip detection when properly initialized by \@2bndy5 in [#962](https://github.com/nRF24/RF24/pull/962)
-- Use quotes for linux/gpio.h include by \@2bndy5 in [#963](https://github.com/nRF24/RF24/pull/963)
-- Use BCM2835 lib's Edge Detection Status for IRQ support by \@2bndy5 in [#969](https://github.com/nRF24/RF24/pull/969)
-- Wrap wiringPiISRStop() in driver API by \@2bndy5 in [#968](https://github.com/nRF24/RF24/pull/968)
-- Bump version to v1.4.9 by \@2bndy5 in [`29231f2`](https://github.com/nRF24/RF24/commit/29231f22d5739b8fb4d3a4d43c9a8ae07a7f1ce4)
-
-[1.4.9]: https://github.com/nRF24/RF24/compare/v1.4.8...v1.4.9
-
-Full commit diff: [`v1.4.8...v1.4.9`][1.4.9]
-
-## New Contributors
-
-- \@dependabot[bot] made their first contribution in [#941](https://github.com/nRF24/RF24/pull/941)
-
-## [1.4.8] - 2023-09-27
-
-### <!-- 8 --> 📝 Documentation
-
-- Mention RPi Pico board's 3v regulator in Pico SDK doc by \@2bndy5 in [#915](https://github.com/nRF24/RF24/pull/915)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Revert available() algorithm by \@2bndy5 in [#914](https://github.com/nRF24/RF24/pull/914)
-- Update COMMON_ISSUES.md by \@TMRh20 in [#918](https://github.com/nRF24/RF24/pull/918)
-- Bump patch version by \@2bndy5 in [`638095e`](https://github.com/nRF24/RF24/commit/638095e0d18b86726116cdf6e87425ebe8b232ec)
-
-[1.4.8]: https://github.com/nRF24/RF24/compare/v1.4.7...v1.4.8
-
-Full commit diff: [`v1.4.7...v1.4.8`][1.4.8]
-
-## [1.4.7] - 2023-06-06
-
-### <!-- 1 --> 🚀 Added
-
-- Add `deploy-release` arg to PIO reusable CI call by \@2bndy5 in [`2ff3f2b`](https://github.com/nRF24/RF24/commit/2ff3f2b9d6c72dd274d8fa5bdbc92e404f6f80b0)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Reworked the utility/rp2 SPI class and removed static members by \@TheGarkine in [#892](https://github.com/nRF24/RF24/pull/892)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- [OrangePi Zero] Linux chip enable conditional statement by \@fertinator in [#904](https://github.com/nRF24/RF24/pull/904)
-- Fix for potential memory issue by \@TMRh20 in [`457e036`](https://github.com/nRF24/RF24/commit/457e03694f6e3923b2425bb1e7be3feeed630996)
-
-### <!-- 8 --> 📝 Documentation
-
-- Doc tweaks and reusable CI by \@2bndy5 in [#887](https://github.com/nRF24/RF24/pull/887)
-- Alias gpio pin datatype by \@2bndy5 in [#898](https://github.com/nRF24/RF24/pull/898)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Solve \#894 by \@2bndy5 in [#895](https://github.com/nRF24/RF24/pull/895)
-- Resolves \#899 by \@2bndy5 in [`557d165`](https://github.com/nRF24/RF24/commit/557d165c12e72329b7573b380eb1e7f132cfbfe6)
-- Update pico_sdk.md to reflect changes to SPI by \@matt-walker0 in [#900](https://github.com/nRF24/RF24/pull/900)
-- Update version for release by \@TMRh20 in [`a028813`](https://github.com/nRF24/RF24/commit/a028813b285d6cec3090d2c96984bd67a399c52e)
-
-[1.4.7]: https://github.com/nRF24/RF24/compare/v1.4.6...v1.4.7
-
-Full commit diff: [`v1.4.6...v1.4.7`][1.4.7]
-
-## New Contributors
-
-- \@fertinator made their first contribution in [#904](https://github.com/nRF24/RF24/pull/904)
-- \@TheGarkine made their first contribution in [#892](https://github.com/nRF24/RF24/pull/892)
-
-## [1.4.6] - 2022-09-18
-
-### <!-- 1 --> 🚀 Added
-
-- Add manual trigger to docs CI by \@2bndy5 in [#868](https://github.com/nRF24/RF24/pull/868)
-- Add printf support to ESP32/8266 and arduino-pico cores by \@2bndy5 in [#873](https://github.com/nRF24/RF24/pull/873)
-
-### <!-- 2 --> 🚫 Deprecated
-
-- Fix `pgm_read_byte/word()` definitions by \@2bndy5 in [#871](https://github.com/nRF24/RF24/pull/871)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix Raspberry Pi company name by \@lurch in [#858](https://github.com/nRF24/RF24/pull/858)
-- Fix `pgm_read_ptr()` (fixes bblanchon/ArduinoJson\#1790) by \@bblanchon in [#864](https://github.com/nRF24/RF24/pull/864)
-
-### <!-- 8 --> 📝 Documentation
-
-- Adjust writeFast docs by \@2bndy5 in [#866](https://github.com/nRF24/RF24/pull/866)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Make utilities/CMakeLists.txt respect RF24_NO_IRQ by \@2bndy5 in [#859](https://github.com/nRF24/RF24/pull/859)
-- Do not set PA level on begin by \@TMRh20 in [`8ad2886`](https://github.com/nRF24/RF24/commit/8ad2886b846375fca5cfcda74da784d3452d9148)
-- Bump version (patch) by \@2bndy5 in [`d7c4041`](https://github.com/nRF24/RF24/commit/d7c4041f001a7fbc880535f5151f89a56a520072)
-
-[1.4.6]: https://github.com/nRF24/RF24/compare/v1.4.5...v1.4.6
-
-Full commit diff: [`v1.4.5...v1.4.6`][1.4.6]
-
-## New Contributors
-
-- \@bblanchon made their first contribution in [#864](https://github.com/nRF24/RF24/pull/864)
-- \@lurch made their first contribution in [#858](https://github.com/nRF24/RF24/pull/858)
-
-## [1.4.5] - 2022-07-19
-
-### <!-- 3 --> 🗑️ Removed
-
-- Remove trailing whitespace and add a blank line by \@2bndy5 in [`3f786bf`](https://github.com/nRF24/RF24/commit/3f786bffd5e27bd67bbe518bcc3249885fde05ec)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- All single line loops and conditions use curly brackets by \@2bndy5 in [#855](https://github.com/nRF24/RF24/pull/855)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Bump version by \@2bndy5 in [`a04f32b`](https://github.com/nRF24/RF24/commit/a04f32b1fb0b2aa3070179d6abcde0aacaf60ebb)
-
-[1.4.5]: https://github.com/nRF24/RF24/compare/v1.4.4...v1.4.5
-
-Full commit diff: [`v1.4.4...v1.4.5`][1.4.5]
-
-## [1.4.4] - 2022-07-18
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix for data corruption issues by \@TMRh20 in [`399d219`](https://github.com/nRF24/RF24/commit/399d219d6db589df449a56534d6327048915af87)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update version by \@TMRh20 in [`d7ba9c2`](https://github.com/nRF24/RF24/commit/d7ba9c2fb83f7c2fbb6336f76b607c630f3ebfc2)
-
-[1.4.4]: https://github.com/nRF24/RF24/compare/v1.4.3...v1.4.4
-
-Full commit diff: [`v1.4.3...v1.4.4`][1.4.4]
-
-## [1.4.3] - 2022-07-09
-
-### <!-- 1 --> 🚀 Added
-
-- Add support for sprintf by \@dstroy0 in [#821](https://github.com/nRF24/RF24/pull/821)
-- Add new feature encodeRadioDetails() and optimize sprintfPrettyDetails() by \@dstroy0 in [#825](https://github.com/nRF24/RF24/pull/825)
-- Add isChipConnected() to py wrapper by \@2bndy5 in [`6c5993f`](https://github.com/nRF24/RF24/commit/6c5993f1130d396677d63f7bd0623e491f833160)
-- Add isFifo() methods by \@2bndy5 in [#849](https://github.com/nRF24/RF24/pull/849)
-- Add model variant info to printPrettyDetails() by \@2bndy5 in [#850](https://github.com/nRF24/RF24/pull/850)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Various improvements to docs by \@2bndy5 in [#844](https://github.com/nRF24/RF24/pull/844)
-- Clang format by \@2bndy5 in [#824](https://github.com/nRF24/RF24/pull/824)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix logic in disableAckPayloads() by \@2bndy5 in [`f9e5075`](https://github.com/nRF24/RF24/commit/f9e507544686af23bcfe9578a1558bbb08d382c9)
-- Fix \#832 typo in printDetails() by \@2bndy5 in [`d4c3c35`](https://github.com/nRF24/RF24/commit/d4c3c355af0ed5d326ec79b5bbe56ff0f2a3d146)
-- Patch for \#834 by \@2bndy5 in [#839](https://github.com/nRF24/RF24/pull/839)
-
-### <!-- 8 --> 📝 Documentation
-
-- Update docs README by \@2bndy5 in [`e4e7156`](https://github.com/nRF24/RF24/commit/e4e7156f00418cb9e18d340fb7319d96145f2302)
-- [docs] fix recieved -> received typos by \@prawnpie in [#817](https://github.com/nRF24/RF24/pull/817)
-- Pigpio Testing by \@TMRh20 in [#819](https://github.com/nRF24/RF24/pull/819)
-- Revert changes to install doc by \@TMRh20 in [`8ccbb9d`](https://github.com/nRF24/RF24/commit/8ccbb9dc747cc6a65a5684d791fb118b54c31536)
-- Update sphinx doc config by \@2bndy5 in [#848](https://github.com/nRF24/RF24/pull/848)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Only run linux CI on "created release" events by \@2bndy5 in [`8d25675`](https://github.com/nRF24/RF24/commit/8d256751d6dbb2523bf3b3376071faef56d073cc)
-- Update actions/checkout to v2 by \@2bndy5 in [`f584685`](https://github.com/nRF24/RF24/commit/f584685c34b6a948384c9512140ad90fd0661770)
-- Updated common issues added issues and fixes by \@matt-walker0 in [#820](https://github.com/nRF24/RF24/pull/820)
-- Undo changes to CI triggers in \#821 by \@2bndy5 in [`b2cf576`](https://github.com/nRF24/RF24/commit/b2cf5769ffbc59c84b9b99a2933d74634f08efab)
-- Ran black on print_dets.py by \@2bndy5 in [`aaf0f53`](https://github.com/nRF24/RF24/commit/aaf0f53cfa4484d9bc0d3f6c2d5be91d8cdfe931)
-- Don't create PDFs on RTD by \@2bndy5 in [`7e69d7d`](https://github.com/nRF24/RF24/commit/7e69d7d1fa10c52a3bbfba1fecec89915995f90e)
-- Update printf.h to include megaAVR by \@Cobalt6700 in [#843](https://github.com/nRF24/RF24/pull/843)
-- Update linux_install.md by \@TMRh20 in [`c327568`](https://github.com/nRF24/RF24/commit/c3275683e62fcb184cfca225f5fb972faad01ad6)
-- Follow up \#824 by \@2bndy5 in [#846](https://github.com/nRF24/RF24/pull/846)
-- Update py examples by \@2bndy5 in [#851](https://github.com/nRF24/RF24/pull/851)
-- Minor version bump by \@2bndy5 in [`54ce53a`](https://github.com/nRF24/RF24/commit/54ce53a960a00d1f64dbd601dfa852936ba4be57)
-
-[1.4.3]: https://github.com/nRF24/RF24/compare/v1.4.2...v1.4.3
-
-Full commit diff: [`v1.4.2...v1.4.3`][1.4.3]
-
-## New Contributors
-
-- \@Cobalt6700 made their first contribution in [#843](https://github.com/nRF24/RF24/pull/843)
-- \@dstroy0 made their first contribution in [#825](https://github.com/nRF24/RF24/pull/825)
-- \@matt-walker0 made their first contribution in [#820](https://github.com/nRF24/RF24/pull/820)
-- \@prawnpie made their first contribution in [#817](https://github.com/nRF24/RF24/pull/817)
-
-## [1.4.2] - 2021-11-27
-
-### <!-- 1 --> 🚀 Added
-
-- Pico SDK support, Sphinx, documentation updates and CMake build system for Linux by \@2bndy5 in [#772](https://github.com/nRF24/RF24/pull/772)
-- Add pico examples to sphinx docs by \@2bndy5 in [`6741869`](https://github.com/nRF24/RF24/commit/67418691dadcfc11bbbd30c9bab7ef10205bce8c)
-
-### <!-- 2 --> 🚫 Deprecated
-
-- Document deprecated stuff in sphinx by \@2bndy5 in [`6ec52c7`](https://github.com/nRF24/RF24/commit/6ec52c782fff5b5c88d8ab6778b276836d215772)
-
-### <!-- 8 --> 📝 Documentation
-
-- Sphinx docs updates by \@2bndy5 in [#803](https://github.com/nRF24/RF24/pull/803)
-- Resolve \#779 and augment docs by \@2bndy5 in [`04b103e`](https://github.com/nRF24/RF24/commit/04b103e81a7d21437a3ec0958a9d39bbd87a6c98)
-- Small docs update by \@2bndy5 in [`f9447d9`](https://github.com/nRF24/RF24/commit/f9447d9c81a11862a27eb6fdf34edbac2f6ee489)
-- [docs] fix API sig; add badge; fix dup heading by \@2bndy5 in [`3befead`](https://github.com/nRF24/RF24/commit/3befead0495ac4d92228632e7d49a0c2d4f17ddc)
-- Reverse Engineering tricks by \@2bndy5 in [#804](https://github.com/nRF24/RF24/pull/804)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update pyRF24.cpp by \@razerraz in [#704](https://github.com/nRF24/RF24/pull/704)
-- Save tag file to doxygen html output by \@2bndy5 in [`2a03328`](https://github.com/nRF24/RF24/commit/2a033285ed22a24dd391a209a49b976032801c93)
-- Revert "save tag file to doxygen html output" by \@2bndy5 in [`741a508`](https://github.com/nRF24/RF24/commit/741a5085938008dc97136298d3e9f3cebd1e76cd)
-- Trigger rp2xxx CI (picoSDK v1.3.0) by \@2bndy5 in [`496f5da`](https://github.com/nRF24/RF24/commit/496f5da29ba96cb40f1cb761d278211ee807f4b3)
-
-[1.4.2]: https://github.com/nRF24/RF24/compare/v1.4.1...v1.4.2
-
-Full commit diff: [`v1.4.1...v1.4.2`][1.4.2]
-
-## New Contributors
-
-- \@razerraz made their first contribution in [#704](https://github.com/nRF24/RF24/pull/704)
-
-## [1.4.1] - 2021-06-02
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Undo latest changes to SoftSPI & add patches by \@2bndy5 in [#771](https://github.com/nRF24/RF24/pull/771)
-
-### <!-- 8 --> 📝 Documentation
-
-- Use angle brackets in a docs code block by \@2bndy5 in [`7c3d6ec`](https://github.com/nRF24/RF24/commit/7c3d6ecfc55e52ab1cd968ea71d5c86ab8c7ffd4)
-
-[1.4.1]: https://github.com/nRF24/RF24/compare/v1.4.0...v1.4.1
-
-Full commit diff: [`v1.4.0...v1.4.1`][1.4.1]
-
-## [1.4.0] - 2021-04-11
-
-### <!-- 1 --> 🚀 Added
-
-- Add printf.h fix from \@TonioChingon in \#739 by \@2bndy5 in [`c0279c8`](https://github.com/nRF24/RF24/commit/c0279c881f36d5be556564c5750014f89667f235)
-- Add Due to ArduinoCLI action by \@2bndy5 in [`41484dc`](https://github.com/nRF24/RF24/commit/41484dc781a002e4ec67b68fdae7799b92afca7c)
-- Add MRAA to Linux CI action by \@2bndy5 in [`8e7d470`](https://github.com/nRF24/RF24/commit/8e7d4709371608222e582930462670fc951d5011)
-- Add example code snippets to Arduino support pg by \@2bndy5 in [`4770050`](https://github.com/nRF24/RF24/commit/477005031ff0473d2f2999a82a07daf8aec56b16)
-- Add msg about COMMON_ISSUES to README by \@2bndy5 in [`e26f202`](https://github.com/nRF24/RF24/commit/e26f202d74d57a3143df1c93a1964fe5f163ccdd)
-- Add estimated mbed example to arduino.md by \@2bndy5 in [`2ea8cbf`](https://github.com/nRF24/RF24/commit/2ea8cbf80a0389847046b549569126df6b34d8a4)
-- Add pinout img from RF24Audio repo by \@2bndy5 in [`d159954`](https://github.com/nRF24/RF24/commit/d159954b54add6e7318532aed6f0bdc9e009726d)
-- Docs review by \@2bndy5 in [#750](https://github.com/nRF24/RF24/pull/750)
-
-### <!-- 2 --> 🚫 Deprecated
-
-- Doxygen v1.9.1 deprecated COLS_IN_ALPHA_INDEX tag by \@2bndy5 in [`d4e1e0d`](https://github.com/nRF24/RF24/commit/d4e1e0dda8091041e0a988dfa98d76dedbac9152)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Remove useless Due config file \#752 by \@2bndy5 in [`25d5530`](https://github.com/nRF24/RF24/commit/25d5530a42a77e53a864c08a18d755e55bff6950)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fixed platforms list in library.json by \@dagix5 in [#742](https://github.com/nRF24/RF24/pull/742)
-- Fix faulty \#ifdef logic by \@2bndy5 in [`416cc35`](https://github.com/nRF24/RF24/commit/416cc35d69dd7cbe5874cee5775c70081b73b319)
-- Fix teensy support; add PIO CI for teensy by \@2bndy5 in [`6935766`](https://github.com/nRF24/RF24/commit/693576613efc503c4932910bbe533e1f0ebf7f73)
-- Fix \#414; note need mbed example in arduino.md by \@2bndy5 in [`5a28733`](https://github.com/nRF24/RF24/commit/5a28733542997d8295a6206cadc9f7c49ce1ae7b)
-- Fix printf() only for adafruit/ArduinoCore-SAMD by \@2bndy5 in [`27710e2`](https://github.com/nRF24/RF24/commit/27710e2cc41146fbaca5af600f3e38ee9f416a49)
-- Fix indent by \@2bndy5 in [`1e974ce`](https://github.com/nRF24/RF24/commit/1e974ce2f2550d756e6ca5af3da55f5077adb037)
-
-### <!-- 8 --> 📝 Documentation
-
-- Overload begin() and amended docs about begin() by \@2bndy5 in [`fee50f6`](https://github.com/nRF24/RF24/commit/fee50f69196bb0f7a16e9097127ee6af99317104)
-- Doxygen action shouldn't create a docs folder by \@2bndy5 in [`715ed75`](https://github.com/nRF24/RF24/commit/715ed754facdf0e59904c0cd15e9216110c27b59)
-- Doc typos by \@2bndy5 in [`36449a5`](https://github.com/nRF24/RF24/commit/36449a5581429cecf51a00e8ad32b854c68829ae)
-- Due can't use SPI_PTR; delete ATXMEGA/readme.md by \@2bndy5 in [`a54668e`](https://github.com/nRF24/RF24/commit/a54668ee0efb9607d7a8ea342f77ae54801b5785)
-- Boost.py docs suck by \@2bndy5 in [`79ce0cd`](https://github.com/nRF24/RF24/commit/79ce0cd7098ec8b25d4bc2ec5745c507255eef87)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Endorse COMMON_ISSUES.md in issue templates by \@2bndy5 in [#747](https://github.com/nRF24/RF24/pull/747)
-- Abstract related pages from header by \@2bndy5 in [`e971e5b`](https://github.com/nRF24/RF24/commit/e971e5bc1fe650f571f87ece096bd9af46706581)
-- Convert _SPI calls to pointers where applicable by \@2bndy5 in [`5b0b0f9`](https://github.com/nRF24/RF24/commit/5b0b0f9237fad9d41b02bacfe50e3fe880ce4aa2)
-- Typo made BCM driver fail by \@2bndy5 in [`b0f81d3`](https://github.com/nRF24/RF24/commit/b0f81d30647bd4b297146594d1a83b593e23694f)
-- Bump version to v1.4.0 by \@2bndy5 in [`9702367`](https://github.com/nRF24/RF24/commit/9702367f45c818ef5c249589a58f95fae7ec724f)
-- Exclude only RF24_LINUX by \@2bndy5 in [`4e7a548`](https://github.com/nRF24/RF24/commit/4e7a5487e8a99897ba4bdf24174a68ce61848ee3)
-- Apply ptr treatment to Teensy, LittleWire, & Due by \@2bndy5 in [`46f22f0`](https://github.com/nRF24/RF24/commit/46f22f0c29f17e01acd255bb9c4ddeac241610fe)
-- Trigger ArduinoCLI action by \@2bndy5 in [`4d68464`](https://github.com/nRF24/RF24/commit/4d684648dcc3fd60f3d3b5f9cc1d3a7e67b43ac4)
-- No need to specify output dir in doxygen action by \@2bndy5 in [`55a3312`](https://github.com/nRF24/RF24/commit/55a3312e4996c5c741b41f5951a2f185e8902834)
-- Make my life simpler: use new RF24_SPI_PTR macro by \@2bndy5 in [`5bda5c9`](https://github.com/nRF24/RF24/commit/5bda5c96109c978c869eeb2c628d0d1c1601cf8e)
-- Forgot about c'tor; fix 2-space indent in begin() by \@2bndy5 in [`f537882`](https://github.com/nRF24/RF24/commit/f537882b684237a59bb87f836b6c54110da1dc9b)
-- Abstract SPI::begin() from _init_pins() by \@2bndy5 in [`19b9c32`](https://github.com/nRF24/RF24/commit/19b9c32e9ac90b1e14e9e77c3dbcfdc4f63c0054)
-- Adjust csn_pin before SPI.begin() on BCM driver by \@2bndy5 in [`4b4bd71`](https://github.com/nRF24/RF24/commit/4b4bd7108f081107dc7160884abf18afbccfdf79)
-- Conforming whitespace by \@2bndy5 in [`ff8f8fb`](https://github.com/nRF24/RF24/commit/ff8f8fb8b310e66613f8c86233123fe7581abd37)
-- Rename atxmega.md & add link to supported product by \@2bndy5 in [`d0bdfd8`](https://github.com/nRF24/RF24/commit/d0bdfd8b816bcc41ae7cf56c59f2fe582eb44ab9)
-- [PIO CI] use quoted matrix entries by \@2bndy5 in [`94d1441`](https://github.com/nRF24/RF24/commit/94d1441f20614dab1e1e0884ca05b76d8efc42e8)
-- [PIO CI] use single quotes? by \@2bndy5 in [`1f65995`](https://github.com/nRF24/RF24/commit/1f659958592aaf1871c587cbbc9abc99b34d7930)
-- I hate YML by \@2bndy5 in [`7826e86`](https://github.com/nRF24/RF24/commit/7826e86a7b26cfec45ecd0bd3ef3a4ba1388a32b)
-- Gimme that badge by \@2bndy5 in [`101aa2a`](https://github.com/nRF24/RF24/commit/101aa2ac45eb5d6ee5cb49de61d5188ce1c14f15)
-- Typo by \@2bndy5 in [`8fb76c8`](https://github.com/nRF24/RF24/commit/8fb76c8b216db7449f86e4e666679a3b44d1ff3e)
-- [Linux CI] MRAA install needs special permission by \@2bndy5 in [`fb62fbd`](https://github.com/nRF24/RF24/commit/fb62fbd9d52189aa6b072360d7e6473b4fcc906b)
-- Try with "sudo bash -c" by \@2bndy5 in [`ea855d7`](https://github.com/nRF24/RF24/commit/ea855d725d65d100f488dec2d5ded46283e33be7)
-- [Linux CI] MRAA not cross compiling (I think) by \@2bndy5 in [`cc95a77`](https://github.com/nRF24/RF24/commit/cc95a77a508dc19bcd7f28a013e6fd3535282e94)
-- Avr/pgmspace.h was added to Due core in 2013 by \@2bndy5 in [`22995fd`](https://github.com/nRF24/RF24/commit/22995fdc34a91f064a749821a570f3a25343ace3)
-- Oops, undo my testing change by \@2bndy5 in [`54e4886`](https://github.com/nRF24/RF24/commit/54e4886aa0378ec9fceaf69b4ac8451a93cd19b9)
-- Ammend support for SPI_UART in csn() by \@2bndy5 in [`9989c20`](https://github.com/nRF24/RF24/commit/9989c205b57d53ac0425dd683f013538ad2a23ac)
-- Confirm working 2nd SPI bus on esp8266 \#648 by \@2bndy5 in [`02ba92f`](https://github.com/nRF24/RF24/commit/02ba92f346f180898587b0c4beeaef94fef08ced)
-- C-n-p artifact; more indent inconcsistencies by \@2bndy5 in [`0a6aae3`](https://github.com/nRF24/RF24/commit/0a6aae3bfc632bbe1568bca03d215f1023f5829e)
-- Comment out theroretical example snippets by \@2bndy5 in [`4b6fb8d`](https://github.com/nRF24/RF24/commit/4b6fb8d4e99b95511df334f8a5a6e06f8f44ee1f)
-- Doxygen sux at reading imgs by \@2bndy5 in [`55cc2dd`](https://github.com/nRF24/RF24/commit/55cc2ddf22acd03499103222a00b2a130bc19706)
-- Implement \#539 by \@2bndy5 in [`0c433f3`](https://github.com/nRF24/RF24/commit/0c433f3bc30e682eb5d3086609132465007e1d5c)
-- My CnP skills are lacking by \@2bndy5 in [`befe021`](https://github.com/nRF24/RF24/commit/befe02112fe989ee082b271e26745a28898725e7)
-- Need to test py wrapper by \@2bndy5 in [`1f0335b`](https://github.com/nRF24/RF24/commit/1f0335b4d56a1842dae043101d553213d94f7167)
-- [py_wrap] begin fails to compile by \@2bndy5 in [`76f6048`](https://github.com/nRF24/RF24/commit/76f6048963df6252d05ef90cb9ae7fed896a74de)
-- [py wrap] oops left the old begin still in there by \@2bndy5 in [`768be5b`](https://github.com/nRF24/RF24/commit/768be5b4405abcbcf07e845b3aaddac7111f416f)
-- [py wrap] use thin wrapper for begin_w/_pins by \@2bndy5 in [`fffd6bc`](https://github.com/nRF24/RF24/commit/fffd6bc3d8d48b0a8ca4f1ca3f4d8037d6135006)
-- [pr wrap] try explicit begin(void) by \@2bndy5 in [`458e638`](https://github.com/nRF24/RF24/commit/458e63838ca6fadb32fa26027160ef141d016506)
-- [py wrap] try using same name for begin(pin, pin) by \@2bndy5 in [`fe87b19`](https://github.com/nRF24/RF24/commit/fe87b19113fd83b6f38df7776682010402cd7cb9)
-- [py wrap] c'tor overload is bad by \@2bndy5 in [`bc64e6f`](https://github.com/nRF24/RF24/commit/bc64e6f764f4d0647ed06ba06178a4ce49e5c880)
-- [py wrap] "optional<>" template didn't take by \@2bndy5 in [`bba718c`](https://github.com/nRF24/RF24/commit/bba718c46aecf3cab23d86d0db156addb3ae3c4e)
-- [py wrap] unmatched parenthesis by \@2bndy5 in [`93817ca`](https://github.com/nRF24/RF24/commit/93817cacbcad82b3b6f45c420418d56b9e2be67f)
-- Advise that teensy doesn't need overloaded begin() by \@2bndy5 in [`4e431a6`](https://github.com/nRF24/RF24/commit/4e431a6501c900b76341b38ed4b1cf3a786988e8)
-
-[1.4.0]: https://github.com/nRF24/RF24/compare/v1.3.12...v1.4.0
-
-Full commit diff: [`v1.3.12...v1.4.0`][1.4.0]
-
-## New Contributors
-
-- \@dagix5 made their first contribution in [#742](https://github.com/nRF24/RF24/pull/742)
-
-## [1.3.12] - 2021-02-27
-
-### <!-- 1 --> 🚀 Added
-
-- Add STM32 to supported by \@TMRh20 in [`02ff620`](https://github.com/nRF24/RF24/commit/02ff620a2fc8de3769442a74988efd0a30f1476e)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Clamp setRetries() args & doc main page fixes by \@2bndy5 in [#709](https://github.com/nRF24/RF24/pull/709)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix links to datasheets by \@2bndy5 in [#699](https://github.com/nRF24/RF24/pull/699)
-- Fix millis() functionality by \@TMRh20 in [`61a3ffc`](https://github.com/nRF24/RF24/commit/61a3ffc16c6cbad580da79f48ab6c6511001d254)
-- Fix print pretty by \@2bndy5 in [#707](https://github.com/nRF24/RF24/pull/707)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Wrapped setters/getters of channel & payloadSize by \@2bndy5 in [#701](https://github.com/nRF24/RF24/pull/701)
-- Update version for release by \@TMRh20 in [`11298d5`](https://github.com/nRF24/RF24/commit/11298d52113c3f109928b81043810456b0a809bf)
-- Update MulticeiverDemo.ino by \@2bndy5 in [#733](https://github.com/nRF24/RF24/pull/733)
-- Community appreciation by \@2bndy5 in [#735](https://github.com/nRF24/RF24/pull/735)
-- Conclude work on a small branch by \@2bndy5 in [#737](https://github.com/nRF24/RF24/pull/737)
-- Update COMMON_ISSUES.md by \@2bndy5 in [#738](https://github.com/nRF24/RF24/pull/738)
-- Merge branch 'master' of https://github.com/nRF24/RF24 by \@TMRh20 in [`2af44fc`](https://github.com/nRF24/RF24/commit/2af44fcac5b0022780a18fddde593359194c634d)
-
-[1.3.12]: https://github.com/nRF24/RF24/compare/v1.3.11...v1.3.12
-
-Full commit diff: [`v1.3.11...v1.3.12`][1.3.12]
-
-## [1.3.11] - 2020-12-18
-
-### <!-- 2 --> 🚫 Deprecated
-
-- New examples and more by \@2bndy5 in [#691](https://github.com/nRF24/RF24/pull/691)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Follow-up fixes from \#691 by \@2bndy5 in [#697](https://github.com/nRF24/RF24/pull/697)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update library.json by \@TMRh20 in [`a965e6a`](https://github.com/nRF24/RF24/commit/a965e6ae68f0294fcd628700c9675cf8ea75a00c)
-- Update library.properties by \@TMRh20 in [`045a689`](https://github.com/nRF24/RF24/commit/045a6898d666a820cd8b995c7fff94d5af268d72)
-
-[1.3.11]: https://github.com/nRF24/RF24/compare/v1.3.10...v1.3.11
-
-Full commit diff: [`v1.3.10...v1.3.11`][1.3.11]
-
-## [1.3.10] - 2020-12-14
-
-### <!-- 1 --> 🚀 Added
-
-- Addressed some Doxygen warnings and issues by \@2bndy5 in [#639](https://github.com/nRF24/RF24/pull/639)
-- Added a link to doxygen documentation to CONTRIBUTING.md by \@2bndy5 in [#637](https://github.com/nRF24/RF24/pull/637)
-- Add ARC to printDetails() by \@jscrane in [#647](https://github.com/nRF24/RF24/pull/647)
-- Add changes to stopListening by \@TMRh20 in [`a0cd707`](https://github.com/nRF24/RF24/commit/a0cd707137607842f0ef782f12f2e40409a12d38)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Remove SPI class for ATTiny: provided by ATTinyCore by \@jscrane in [#646](https://github.com/nRF24/RF24/pull/646)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix for wiringPi by \@TMRh20 in [`34b4892`](https://github.com/nRF24/RF24/commit/34b4892a7293287a2f36fee4e8f391314412a188)
-
-### <!-- 8 --> 📝 Documentation
-
-- Improved CONTRIBUTING.md and README.md by \@2bndy5 in [#635](https://github.com/nRF24/RF24/pull/635)
-- Make RF24_POWERUP_DELAY configurable in RF24_config.h by \@jscrane in [#690](https://github.com/nRF24/RF24/pull/690)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update python wrapper by \@TMRh20 in [`4fd92d1`](https://github.com/nRF24/RF24/commit/4fd92d113359902b8e7b8ea00dd42ed65e676155)
-- Update CONTRIBUTING.md by \@Avamander in [`d062771`](https://github.com/nRF24/RF24/commit/d0627715a2e9ff626e7bfbb4d89215f94c9bc8cd)
-- Available() could be slightly faster \#631 by \@jscrane in [#650](https://github.com/nRF24/RF24/pull/650)
-- Update library.properties by \@TMRh20 in [`7debc6f`](https://github.com/nRF24/RF24/commit/7debc6f6202e6807401a135fd8c91a9ad4c594d5)
-- Update library.json by \@TMRh20 in [`c7cfbea`](https://github.com/nRF24/RF24/commit/c7cfbea636dbb552fcf93829b3b397b62dc9814d)
-
-[1.3.10]: https://github.com/nRF24/RF24/compare/v1.3.9...v1.3.10
-
-Full commit diff: [`v1.3.9...v1.3.10`][1.3.10]
-
-## New Contributors
-
-- \@jscrane made their first contribution in [#690](https://github.com/nRF24/RF24/pull/690)
-- \@2bndy5 made their first contribution in [#637](https://github.com/nRF24/RF24/pull/637)
-
-## [1.3.9] - 2020-08-22
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix compilation errors by \@TMRh20 in [`c0440e0`](https://github.com/nRF24/RF24/commit/c0440e0b7fc425d1c0b9819c9f9bfeac731ec069)
-
-[1.3.9]: https://github.com/nRF24/RF24/compare/v1.3.8...v1.3.9
-
-Full commit diff: [`v1.3.8...v1.3.9`][1.3.9]
-
-## [1.3.8] - 2020-08-17
-
-### <!-- 3 --> 🗑️ Removed
-
-- Improve switching from TX->RX by \@TMRh20 in [`a779828`](https://github.com/nRF24/RF24/commit/a779828026b243585a3407d4895c6ca947d37b89)
-- Remove warning in configure by \@TMRh20 in [`59123c6`](https://github.com/nRF24/RF24/commit/59123c6860b668a587aeaa338567129aa3923afa)
-
-### <!-- 8 --> 📝 Documentation
-
-- Adjustment for prev change, doc update by \@TMRh20 in [`19c3357`](https://github.com/nRF24/RF24/commit/19c3357bee57afa006005616aa1d72d24a674874)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Clean up begin() function by \@TMRh20 in [`3272fac`](https://github.com/nRF24/RF24/commit/3272facf4db3a02f7d2b3e8fd56dbf36e568aec6)
-- Update for relese by \@TMRh20 in [`bb71b13`](https://github.com/nRF24/RF24/commit/bb71b13d600631f71df4de35df6f5ca5fe363377)
-
-[1.3.8]: https://github.com/nRF24/RF24/compare/v1.3.7...v1.3.8
-
-Full commit diff: [`v1.3.7...v1.3.8`][1.3.8]
-
-## [1.3.7] - 2020-08-01
-
-### <!-- 1 --> 🚀 Added
-
-- Added Constant Carrier Wave by \@waltbar in [#609](https://github.com/nRF24/RF24/pull/609)
-- Add CCW to scanner example by \@TMRh20 in [`92b15c7`](https://github.com/nRF24/RF24/commit/92b15c74f0790a89554229eae4a86e0d10578037)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Update printDetails() by \@TMRh20 in [`ed35bd9`](https://github.com/nRF24/RF24/commit/ed35bd93cc981ca1e118556a2e530954cdb80125)
-- Cleanup examples by \@TMRh20 in [`6ab44fc`](https://github.com/nRF24/RF24/commit/6ab44fccda97f3a81a664108d4a6432d2297594c)
-- Update RF24 docs by \@TMRh20 in [`399f1a9`](https://github.com/nRF24/RF24/commit/399f1a91f50261f9c4ad0828fd8895cf8fd8040e)
-- Update python wrapper by \@TMRh20 in [`7bd5f7f`](https://github.com/nRF24/RF24/commit/7bd5f7f99f07e0d3ad2bc5b0f28994c5624b6e02)
-- Removed ancient lefovers by \@Avamander in [`4751968`](https://github.com/nRF24/RF24/commit/47519686ccf46545d2fa0b02e0c604fb1646d6d7)
-- Removed ancient leftovers by \@Avamander in [`1f83dd7`](https://github.com/nRF24/RF24/commit/1f83dd7e4cb79326a6659311b760f60570170bc7)
-- Cleanup of warnings/errors by \@TMRh20 in [`5d6a02a`](https://github.com/nRF24/RF24/commit/5d6a02af52d0bf4e9a9baabb8fe22a4db43b4030)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix bug with RPi timer code by \@TMRh20 in [`13ea68e`](https://github.com/nRF24/RF24/commit/13ea68e06016cc8d164267cd199d4845b115325b)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Merge branch 'master' of https://github.com/nRF24/RF24 by \@TMRh20 in [`e4b5377`](https://github.com/nRF24/RF24/commit/e4b53771c3da9585f1da253a9051c8dbb083d1b6)
-- Unify Aduino & Linux Constructor by \@TMRh20 in [`914db31`](https://github.com/nRF24/RF24/commit/914db3115a2d0c06f2fbbe2fa81d7d408f65b003)
-- Update RF24.h by \@TMRh20 in [`72f5316`](https://github.com/nRF24/RF24/commit/72f5316ea493f7167c11c7b9a8de4c960f127617)
-- Update BCM driver etc by \@TMRh20 in [`1543ad6`](https://github.com/nRF24/RF24/commit/1543ad6e7ecd0d1112541031b0759b8691c0c997)
-- Get rid of compilation warning by \@TMRh20 in [`9231656`](https://github.com/nRF24/RF24/commit/92316566c7e6a40343e659efe47f7c101ad346a6)
-- En/Disable LNA Gain by \@TMRh20 in [`8c081b3`](https://github.com/nRF24/RF24/commit/8c081b3a934cde8eb3f3b5f68e670a195b39070d)
-- Bug Fix! Super Awesome Bug Fix!!!!! by \@TMRh20 in [`3af80f8`](https://github.com/nRF24/RF24/commit/3af80f8fa4ddc741ef9d2f1b9793da0ab5047b1a)
-- Update version & supported architectures by \@TMRh20 in [`64b5103`](https://github.com/nRF24/RF24/commit/64b510384b84cc7d13bb5403480db510451d6d0e)
-- Update version for release by \@TMRh20 in [`4c6c106`](https://github.com/nRF24/RF24/commit/4c6c106f2dcf09e6a31830ccba32c57a8f749939)
-
-[1.3.7]: https://github.com/nRF24/RF24/compare/v1.3.6...v1.3.7
-
-Full commit diff: [`v1.3.6...v1.3.7`][1.3.7]
-
-## New Contributors
-
-- \@waltbar made their first contribution in [#609](https://github.com/nRF24/RF24/pull/609)
-
-## [1.3.6] - 2020-07-14
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix issues with SPI Transactions detection by \@TMRh20 in [`da16f57`](https://github.com/nRF24/RF24/commit/da16f57a1b3d2d1c15628ab1e935e09c6dd06d26)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Linux SPI speed cfg by \@TMRh20 in [`a62aa4a`](https://github.com/nRF24/RF24/commit/a62aa4af0d90c9ca121fb9298b1594e10a936545)
-- RF24 Doc Update by \@TMRh20 in [`b25413e`](https://github.com/nRF24/RF24/commit/b25413e40f66d1f0e5a29c05c10569d92f2f14ff)
-- Update version for release by \@TMRh20 in [`8f214c1`](https://github.com/nRF24/RF24/commit/8f214c153a2cd8d921570cc14e407574e1a14cbe)
-
-[1.3.6]: https://github.com/nRF24/RF24/compare/v1.3.5...v1.3.6
-
-Full commit diff: [`v1.3.5...v1.3.6`][1.3.6]
-
-## [1.3.5] - 2020-07-08
-
-### <!-- 1 --> 🚀 Added
-
-- Added a few missing keywords for syntax highlighting by \@Avamander in [`939ca40`](https://github.com/nRF24/RF24/commit/939ca409e55cdab14ad24162544c551b7e9acb46)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Revert digitalWrite compatibility changes by \@TMRh20 in [`5e1ac02`](https://github.com/nRF24/RF24/commit/5e1ac023b0101cca3d7277d198d7b87ec8e1e241)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix for creating multiple instances with SPIDEV by \@krzysztof9nowak in [#585](https://github.com/nRF24/RF24/pull/585)
-- Fix documentation for build on linux/RPi by \@TMRh20 in [`b323f53`](https://github.com/nRF24/RF24/commit/b323f535aa9644d988370fc6989a2ef9f85aa469)
-- Fix for ESP32 program memory error/warning by \@TMRh20 in [`3667a54`](https://github.com/nRF24/RF24/commit/3667a54ed75d6c0b38fc6037710ef2e095189bfe)
-- Fixed a compiler warning in Linux example by \@gherlein in [#384](https://github.com/nRF24/RF24/pull/384)
-- Fixed undefined behavior in openReadingPipe by \@haellsigh in [#604](https://github.com/nRF24/RF24/pull/604)
-
-### <!-- 8 --> 📝 Documentation
-
-- Update constructor info to reference docs by \@TMRh20 in [`2e75fc2`](https://github.com/nRF24/RF24/commit/2e75fc2a6b30060d4279a141a8348bd97e5090e9)
-- Cleaned up the formatting and improved documentation by \@Avamander in [`e456503`](https://github.com/nRF24/RF24/commit/e456503554529011c4223286a6703fdf411b7733)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update Doxyfile by \@Avamander in [`85ac82a`](https://github.com/nRF24/RF24/commit/85ac82ab1ffbfcb83a5a0ecf1a05059d3964aad8)
-- Documentation update, python & news by \@TMRh20 in [`35c51ff`](https://github.com/nRF24/RF24/commit/35c51ff0ad4f105c3efe9902a2d5fb80457be9f5)
-- Cleaned up the style of of the pingpair_ack example by \@Avamander in [`c49c7e9`](https://github.com/nRF24/RF24/commit/c49c7e984806bb00bfa7fc5d77d8a6f266bc7ddd)
-- Made sure that printf exists when printDetails is used by \@Avamander in [`53b588f`](https://github.com/nRF24/RF24/commit/53b588f2226284f435db88e3557da6a3be19ee0c)
-- Made sure that printf is included when printDetails is used by \@Avamander in [`fcbc804`](https://github.com/nRF24/RF24/commit/fcbc804d2af432848fe7d6a54b8b18e2b25ff5b9)
-- Update pingpair_irq_simple.ino by \@Avamander in [`aa8511f`](https://github.com/nRF24/RF24/commit/aa8511f46995698174262c5f2b1f82f726aed3cc)
-- Clarified printf usage a bit by \@Avamander in [`7bf5dce`](https://github.com/nRF24/RF24/commit/7bf5dceb21e00ce1b0ec0cbb6f95c9cc5c5fe4ce)
-- Increment version for release by \@TMRh20 in [`43f55df`](https://github.com/nRF24/RF24/commit/43f55dfdef228f9455633e3403b386ac0f2ea1bc)
-
-[1.3.5]: https://github.com/nRF24/RF24/compare/v1.3.4...v1.3.5
-
-Full commit diff: [`v1.3.4...v1.3.5`][1.3.5]
-
-## New Contributors
-
-- \@haellsigh made their first contribution in [#604](https://github.com/nRF24/RF24/pull/604)
-- \@gherlein made their first contribution in [#384](https://github.com/nRF24/RF24/pull/384)
-- \@krzysztof9nowak made their first contribution in [#585](https://github.com/nRF24/RF24/pull/585)
-
-## [1.3.4] - 2020-02-15
-
-### <!-- 1 --> 🚀 Added
-
-- Added Dolphin files to gitignore just in case by \@Avamander in [`4b5ba72`](https://github.com/nRF24/RF24/commit/4b5ba72751d8a5463cf0a32b95aef7af89186eb5)
-- Add function to get automatic retransmission count by \@Avamander in [#558](https://github.com/nRF24/RF24/pull/558)
-- Added GitHub actions configuration by \@CoRfr in [#566](https://github.com/nRF24/RF24/pull/566)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Forced braces also on while and for loops, removed unneccesary spaces by \@Avamander in [`71ec8a1`](https://github.com/nRF24/RF24/commit/71ec8a1820f02a5b2b18981251bfb30aad4aeb03)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix in RF24::getDynamicPayloadSize by \@jonnykl in [`ea5dee4`](https://github.com/nRF24/RF24/commit/ea5dee4624d6913708a51c71cf3ae082d2d470f7)
-- Fixes incorrect preprocessor statement being used by \@Avamander in [`147ef4d`](https://github.com/nRF24/RF24/commit/147ef4d72fd7f1ddc457a23ee133a66a99b9fc4b)
-
-### <!-- 8 --> 📝 Documentation
-
-- Overloaded digitalWrite to accept boolean by \@Avamander in [`9f55c0c`](https://github.com/nRF24/RF24/commit/9f55c0c577b229f553bca4c73e3045cc89bf73c1)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update .gitignore by \@Avamander in [`bf25900`](https://github.com/nRF24/RF24/commit/bf259002b2eb0b44df812d7c2d332f70b50525b4)
-- Update to latest BCM 2835 driver for RPI4 support by \@TMRh20 in [`e221acd`](https://github.com/nRF24/RF24/commit/e221acdc4315a39016b31c28143639b27421d75a)
-- Merge pull request \#520 from jonnykl/fix-get-dyn-pld-size-spi by \@TMRh20 in [#520](https://github.com/nRF24/RF24/pull/520)
-- Mod to run RF24 on Raspberry SPI1 by \@Crkk in [`569639a`](https://github.com/nRF24/RF24/commit/569639a5cfedf37239619e29c888bf25395bc0eb)
-- Merge pull request \#530 from Crkk/patch-1 by \@TMRh20 in [#530](https://github.com/nRF24/RF24/pull/530)
-- Reformatted the entire project using a single code style by \@Avamander in [`0d36fca`](https://github.com/nRF24/RF24/commit/0d36fca8406aaf46558c171b8d85d27da2d4d97e)
-- Update CONTRIBUTING.md by \@Avamander in [`d1a5d5e`](https://github.com/nRF24/RF24/commit/d1a5d5e6c5db8f7d2c75289adaba13ec244ee8ad)
-- Improved Github templates by \@olback in [#543](https://github.com/nRF24/RF24/pull/543)
-- Update -march definition on RPi (BCM2835) to fix compilation by \@CoRfr in [#565](https://github.com/nRF24/RF24/pull/565)
-- Improved exception when not running as root by \@CoRfr in [#564](https://github.com/nRF24/RF24/pull/564)
-- Improved indentation and formatting by \@Avamander in [`42cf6dd`](https://github.com/nRF24/RF24/commit/42cf6dd201f961bf2b4891d25b16c400bce90198)
-- Marked MegaAVR as a supported arch by \@Avamander in [`ddc8c62`](https://github.com/nRF24/RF24/commit/ddc8c62c530d0ba71866d38ba30eac8a8a25b203)
-- Marked megaavr as supported by \@Avamander in [`80c456a`](https://github.com/nRF24/RF24/commit/80c456ae3a70c5405d8a5691910c2b3d6489a59b)
-
-[1.3.4]: https://github.com/nRF24/RF24/compare/v1.3.3...v1.3.4
-
-Full commit diff: [`v1.3.3...v1.3.4`][1.3.4]
-
-## New Contributors
-
-- \@CoRfr made their first contribution in [#564](https://github.com/nRF24/RF24/pull/564)
-- \@olback made their first contribution in [#543](https://github.com/nRF24/RF24/pull/543)
-- \@Crkk made their first contribution
-- \@jonnykl made their first contribution
-
-## [1.3.3] - 2019-06-18
-
-### <!-- 1 --> 🚀 Added
-
-- Addi delay to SPI intializer if device already up by \@TMRh20 in [`db6a99b`](https://github.com/nRF24/RF24/commit/db6a99bc0ab98d240bd147c59ff3ff05f1ff5aa0)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix broken stuff after using pgm_read_ptr by \@TMRh20 in [`4220bf5`](https://github.com/nRF24/RF24/commit/4220bf5ce6d804a7ea8a3056102636dda70203de)
-
-### <!-- 8 --> 📝 Documentation
-
-- Update docs for write() per \#500 by \@TMRh20 in [`bd88f9e`](https://github.com/nRF24/RF24/commit/bd88f9e48ba74119ebd9ebd8cdbe6a69ecc4b963)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Clean up printf.h by \@TMRh20 in [`0fabd62`](https://github.com/nRF24/RF24/commit/0fabd62dda48ce621121199078f0ee6790809d30)
-- Modify printDetails to work with ESP8266 by \@TMRh20 in [`c25d840`](https://github.com/nRF24/RF24/commit/c25d84089e91c7e206365fe04b80dcbebf48b640)
-- One more change for pgm_read_ptr by \@TMRh20 in [`2fa6e8c`](https://github.com/nRF24/RF24/commit/2fa6e8cc6c434e3979c24f5149bd725cb8bffb55)
-- Protect against calling bcm_init() more than once by \@TMRh20 in [`b19c3d8`](https://github.com/nRF24/RF24/commit/b19c3d88b99d0c111082d462c4ce203948939323)
-- Protect against initializing SPI more than once by \@TMRh20 in [`304d2bb`](https://github.com/nRF24/RF24/commit/304d2bb4c11d0d9b94f7f08170184ee7f89a0863)
-- Revert to using initialization protection for SPI by \@TMRh20 in [`9f19b40`](https://github.com/nRF24/RF24/commit/9f19b4054fb196d57259d7bb2524640af950e0f7)
-- Improve accuracy of millis() function in SPIDEV by \@TMRh20 in [`3b6391a`](https://github.com/nRF24/RF24/commit/3b6391a06732ad114f5edb7ecc0527bee7811820)
-- Enable failure handling, add example by \@TMRh20 in [`13cbad9`](https://github.com/nRF24/RF24/commit/13cbad91df8136b9ca92eb6e76f14432a8a33f19)
-- Edit example - forgot to add 'break;' by \@TMRh20 in [`6821e42`](https://github.com/nRF24/RF24/commit/6821e42f2781e81c4b95a52ef0b27b1dd8b634c8)
-- Edit RF24_config.h for ESP32 by \@TMRh20 in [`0b24667`](https://github.com/nRF24/RF24/commit/0b2466772ada73b9cb7843128c8aba3a62dafaf0)
-- Make attiny SPI code independent from different Arduino pins definitions by \@troffmo5 in [`41866a3`](https://github.com/nRF24/RF24/commit/41866a3354e82cedaf451453a9f1d5225b30ba88)
-- Merge pull request \#326 from troffmo5/attiny by \@TMRh20 in [#326](https://github.com/nRF24/RF24/pull/326)
-- Update RF24_config.h by \@IkpeohaGodson in [`0015498`](https://github.com/nRF24/RF24/commit/0015498c06b31d524e0471848f6b0891ea56b234)
-- Cleaned up formatting of RF24_config.h by \@Avamander in [`279c67b`](https://github.com/nRF24/RF24/commit/279c67b76ed1fcaa3fd94571f8ab46ef0dfe514d)
-- Update RF24_config.h by \@Avamander in [`df3f821`](https://github.com/nRF24/RF24/commit/df3f8211976c4c457128f7a2dab606c2bea76728)
-- Update RF24_config.h by \@Avamander in [`f3b2fb0`](https://github.com/nRF24/RF24/commit/f3b2fb002386cf9f714b6dec04f959402995ca43)
-- Merge pull request \#502 from IkpeohaGodson/patch-1 and clean up RF24_config.h by \@Avamander in [#502](https://github.com/nRF24/RF24/pull/502)
-- Update library.json by \@Avamander in [`5f9814f`](https://github.com/nRF24/RF24/commit/5f9814f19731595d39464695cc7d1524b8d1cdf4)
-- Update library.properties by \@Avamander in [`fdb4366`](https://github.com/nRF24/RF24/commit/fdb43667485b155269923017668a7650238f075e)
-
-[1.3.3]: https://github.com/nRF24/RF24/compare/v1.3.2...v1.3.3
-
-Full commit diff: [`v1.3.2...v1.3.3`][1.3.3]
-
-## New Contributors
-
-- \@IkpeohaGodson made their first contribution
-- \@troffmo5 made their first contribution
-
-## [1.3.2] - 2019-03-22
-
-### <!-- 1 --> 🚀 Added
-
-- Merge pull request \#413 from haseebehsan/pythonWrappers by \@TMRh20 in [#413](https://github.com/nRF24/RF24/pull/413)
-- Added an exception if non-superuser uses the library by \@akatran in [#428](https://github.com/nRF24/RF24/pull/428)
-- Fixed misleading indent warning in bcm2835.c in [#444](https://github.com/nRF24/RF24/pull/444)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Change perror/abort in SPIDEV driver c++ std exception by \@ludiazv in [`6f74bad`](https://github.com/nRF24/RF24/commit/6f74badb05567bd83b957f5b879060efdcfc085c)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update pingpair_dyn.py by \@TMRh20 in [`57d3eef`](https://github.com/nRF24/RF24/commit/57d3eef5909dbb15f00afec558514000f24951f3)
-- Merge remote-tracking branch 'upstream/master' by \@ludiazv in [`5b09d19`](https://github.com/nRF24/RF24/commit/5b09d193369313946bd28d527f17ca93638d1cb6)
-- Merge pull request \#411 from ludiazv/master by \@TMRh20 in [#411](https://github.com/nRF24/RF24/pull/411)
-- PyRF24 moved to its specific folder by \@haseebehsan in [`8eaa26d`](https://github.com/nRF24/RF24/commit/8eaa26de6066941a32c68fe0aa33b04ff271143f)
-- PyRF24Network python wrapper created by \@haseebehsan in [`570bd1e`](https://github.com/nRF24/RF24/commit/570bd1eafcf545c69a373df3771f223c55a96564)
-- PyRF24Mesh python Wrapper created by \@haseebehsan in [`ba335de`](https://github.com/nRF24/RF24/commit/ba335de7751084a68da8f85908b8c185424ea501)
-- Keeping previous RF24 boost wrapper as it is by \@haseebehsan in [`2e29f9d`](https://github.com/nRF24/RF24/commit/2e29f9d0661218de6d159aef5645237b3e9af00e)
-- Revert "keeping previous RF24 boost wrapper as it is" by \@haseebehsan in [`bbc6b1d`](https://github.com/nRF24/RF24/commit/bbc6b1d452884768bf480e481fb3756552ead2ff)
-- Revert "Revert "keeping previous RF24 boost wrapper as it is"" by \@haseebehsan in [`a476c42`](https://github.com/nRF24/RF24/commit/a476c42a7a1b6394817413f8eab26a95cadda102)
-- Update RPi BCM driver to latest by \@TMRh20 in [`20b9d77`](https://github.com/nRF24/RF24/commit/20b9d77716e9e75993dc7994e82ec3fb6ad40080)
-- SPIDEV compatibility layer improvement and patch for 64bits by \@ludiazv in [#455](https://github.com/nRF24/RF24/pull/455)
-- Reorder libs in linker arguments. by \@wamonite in [`4dcf86c`](https://github.com/nRF24/RF24/commit/4dcf86ca47461ac0793bd47acbddf4e36ddcf6d4)
-- Ensure pyRF24 constructors match C++ conditionals. by \@wamonite in [`ae4c03b`](https://github.com/nRF24/RF24/commit/ae4c03bc49eef915cbd389fc5339396d7849bb90)
-- Merge pull request \#402 from wamonite/dev_up2 by \@TMRh20 in [#402](https://github.com/nRF24/RF24/pull/402)
-- Update Transfer.ino by \@HannHank in [`ba5c39f`](https://github.com/nRF24/RF24/commit/ba5c39faeec42795ce65d4310a3b0ce41b031259)
-- Merge pull request \#457 from HannHank/patch-1 by \@TMRh20 in [#457](https://github.com/nRF24/RF24/pull/457)
-- Update Transfer.ino by \@Avamander in [`a2b35d6`](https://github.com/nRF24/RF24/commit/a2b35d6594160263a5a8c460a9754dd71fba6d95)
-- Automatically choose correct SPI clock divider. by \@herm in [`5b1be4e`](https://github.com/nRF24/RF24/commit/5b1be4ef63b26fea8cbbc88a2beffd7198bc47c1)
-- Merge pull request \#472 from herm/spi_clock by \@TMRh20 in [#472](https://github.com/nRF24/RF24/pull/472)
-- Update delay functions for SPIDEV by \@TMRh20 in [`23d1ca9`](https://github.com/nRF24/RF24/commit/23d1ca92e27490da2b0e98f35dbb2479575cb40f)
-- Set delays by CPU speed by \@TMRh20 in [`a3ab7dd`](https://github.com/nRF24/RF24/commit/a3ab7ddb075360deac54fe2c8e2fab286793d21c)
-- Update library.properties by \@Avamander in [`bba722a`](https://github.com/nRF24/RF24/commit/bba722a01b7be4c9fbb7431c2af1a686fee753e4)
-- Update library.json by \@Avamander in [`56f9bf4`](https://github.com/nRF24/RF24/commit/56f9bf41bd34721308aacf15df607ef7f1fb559c)
-
-[1.3.2]: https://github.com/nRF24/RF24/compare/v1.3.1...v1.3.2
-
-Full commit diff: [`v1.3.1...v1.3.2`][1.3.2]
-
-## New Contributors
-
-- \@herm made their first contribution
-- \@HannHank made their first contribution
-- \@ludiazv made their first contribution in [#455](https://github.com/nRF24/RF24/pull/455)
-- \@haseebehsan made their first contribution
-- \@wamonite made their first contribution
-
-## [1.3.1] - 2018-01-28
-
-### <!-- 1 --> 🚀 Added
-
-- Added implementation for wiringPi driver by \@aurelian17 in [#349](https://github.com/nRF24/RF24/pull/349)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Remove progmem macro overrides (ESP8266 Arduino now supports them) by \@sidoh in [#375](https://github.com/nRF24/RF24/pull/375)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix configure for Raspberry PI 2 B+ Raspberian Jessie by \@MathiasMoog in [#366](https://github.com/nRF24/RF24/pull/366)
-- Use correct separator in keywords.txt by \@per1234 in [#381](https://github.com/nRF24/RF24/pull/381)
-- Fix build issues against ESP32 (ESP-WROOM-32). by \@anders-liu in [#409](https://github.com/nRF24/RF24/pull/409)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Allow redefining SOFTSPI pins with preprocessor flags by \@trojanc in [#372](https://github.com/nRF24/RF24/pull/372)
-- New library release and additional architectures by \@Avamander in [#410](https://github.com/nRF24/RF24/pull/410)
-
-[1.3.1]: https://github.com/nRF24/RF24/compare/v1.3.0...v1.3.1
-
-Full commit diff: [`v1.3.0...v1.3.1`][1.3.1]
-
-## New Contributors
-
-- \@anders-liu made their first contribution in [#409](https://github.com/nRF24/RF24/pull/409)
-- \@trojanc made their first contribution in [#372](https://github.com/nRF24/RF24/pull/372)
-- \@sidoh made their first contribution in [#375](https://github.com/nRF24/RF24/pull/375)
-- \@per1234 made their first contribution in [#381](https://github.com/nRF24/RF24/pull/381)
-- \@aurelian17 made their first contribution in [#349](https://github.com/nRF24/RF24/pull/349)
-- \@MathiasMoog made their first contribution in [#366](https://github.com/nRF24/RF24/pull/366)
-
-## [1.3.0] - 2017-06-01
-
-### <!-- 1 --> 🚀 Added
-
-- Add static initialization for pthread mutexes in [`e204656`](https://github.com/nRF24/RF24/commit/e204656cbdb361a983ee76a7e343ecdb1d22bd54)
-- Add to RF24: Arduino Due supported in SPI_UART by \@TMRh20 in [`3b5fc3e`](https://github.com/nRF24/RF24/commit/3b5fc3e85bd11f075f703b1cbe0709c3cada27dd)
-- Merge pull request \#247 from corcrash/master in [#247](https://github.com/nRF24/RF24/pull/247)
-- Added disableDynamicPayloads() by \@soligen2010 in [#318](https://github.com/nRF24/RF24/pull/318)
-- Added isChipConnected(). by \@wmarkow in [#291](https://github.com/nRF24/RF24/pull/291)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fixed output and made it consistent with output from Ardunio version. by \@campenr in [`efb8ed1`](https://github.com/nRF24/RF24/commit/efb8ed1f8964ca398184b5130c46819dcf2262c3)
-- Fix clamping to a single hex digit by \@nickmooney in [`b37514b`](https://github.com/nRF24/RF24/commit/b37514b9b7199f4d8e8d8fbef11f599eca1e02fa)
-- Fix SPIDEV interface by \@plasticassius in [#315](https://github.com/nRF24/RF24/pull/315)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update to match new RPi scanner example. by \@campenr in [`b233ea1`](https://github.com/nRF24/RF24/commit/b233ea17316a8a37dab77880e8c779e722795b73)
-- Merge pull request \#301 from campenr/master by \@TMRh20 in [#301](https://github.com/nRF24/RF24/pull/301)
-- Per \#242 change binary to hex by \@TMRh20 in [`aaa09e1`](https://github.com/nRF24/RF24/commit/aaa09e1833dc5bb4705f642c9b003af05a27fd25)
-- Merge pull request \#273 from marceloaqno/fix-mutex-init by \@TMRh20 in [#273](https://github.com/nRF24/RF24/pull/273)
-- :begin: reset dynamic_payloads_enabled to false by \@derf in [`17e29ea`](https://github.com/nRF24/RF24/commit/17e29ea1fc8480353305c4434a61788acc4e7c02)
-- Merge pull request \#319 from derf/master by \@derf in [#319](https://github.com/nRF24/RF24/pull/319)
-- Merge branch 'master' into master in [`3c4f842`](https://github.com/nRF24/RF24/commit/3c4f8420dc8c6399837abe937df1799c3ed47506)
-- Merge pull request \#304 from nickmooney/patch-1 by \@nickmooney in [#304](https://github.com/nRF24/RF24/pull/304)
-- Create CONTRIBUTING.md by \@Avamander in [`ea3b7a6`](https://github.com/nRF24/RF24/commit/ea3b7a66918c86d18081736927f86fdda8c5693f)
-- Create LICENSE by \@Avamander in [`706c1d6`](https://github.com/nRF24/RF24/commit/706c1d6eba9082c1221212f270feb4a365642122)
-- Simplified logic of disableDynamicPayloads() by \@mattura in [#332](https://github.com/nRF24/RF24/pull/332)
-- Make flush_rx public by \@soligen2010 in [#352](https://github.com/nRF24/RF24/pull/352)
-- Update library.properties by \@Avamander in [`177bdc5`](https://github.com/nRF24/RF24/commit/177bdc5e3bbdd3a748f3eaca9d9587ca1125ca59)
-- Update library.json by \@Avamander in [`4001548`](https://github.com/nRF24/RF24/commit/40015481ebe81cd8ddac33c05194cc41d1a6138a)
-- Update library.json by \@Avamander in [`7f14e7f`](https://github.com/nRF24/RF24/commit/7f14e7f1fa0dadfe5a68d1234e51094d3eb6287c)
-
-[1.3.0]: https://github.com/nRF24/RF24/compare/RF24v1.2.0...v1.3.0
-
-Full commit diff: [`RF24v1.2.0...v1.3.0`][1.3.0]
-
-## New Contributors
-
-- \@soligen2010 made their first contribution in [#352](https://github.com/nRF24/RF24/pull/352)
-- \@mattura made their first contribution in [#332](https://github.com/nRF24/RF24/pull/332)
-- \@plasticassius made their first contribution in [#315](https://github.com/nRF24/RF24/pull/315)
-- \@nickmooney made their first contribution in [#304](https://github.com/nRF24/RF24/pull/304)
-- \@derf made their first contribution in [#319](https://github.com/nRF24/RF24/pull/319)
-- \@campenr made their first contribution
-
-## [RF24v1.2.0] - 2016-11-05
-
-### <!-- 1 --> 🚀 Added
-
-- Add link to RPi/Linux Blog Post in documentation by \@TMRh20 in [`63c83d4`](https://github.com/nRF24/RF24/commit/63c83d4f4e913185e510d2ef291ca608605bfd20)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix bad documentation link from last commit by \@TMRh20 in [`c94f877`](https://github.com/nRF24/RF24/commit/c94f87746552a3c662c35fd11e772b747f19d8ee)
-
-### <!-- 8 --> 📝 Documentation
-
-- Minor documentation correction - RF24_CRC_DISABLED by \@pfeerick in [`3766eeb`](https://github.com/nRF24/RF24/commit/3766eebf139ed83fb5129ce06521c6168d2749c2)
-- Merge pull request \#286 from pfeerick/patch-1 by \@TMRh20 in [#286](https://github.com/nRF24/RF24/pull/286)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update PlatformIO library manifest by \@valeros in [`aa54114`](https://github.com/nRF24/RF24/commit/aa54114b6c29e8dcae221d90c73288b07042033e)
-- Merge pull request \#280 from valeros/patch-1 by \@Avamander in [#280](https://github.com/nRF24/RF24/pull/280)
-- Let's PlatformIO decide how to build Arduino v1.0 library by \@ivankravets in [`903fc55`](https://github.com/nRF24/RF24/commit/903fc55e364cfe9fe87c63e512bc8bb05152de85)
-- Merge pull request \#284 from ivankravets/patch-2 by \@TMRh20 in [#284](https://github.com/nRF24/RF24/pull/284)
-- Make internal delays configurable by \@TMRh20 in [`195f5ac`](https://github.com/nRF24/RF24/commit/195f5ac1d7451d72f320de3c050c20a1ccd3ff0f)
-- Update Library Version 1.2 by \@TMRh20 in [`8ea5127`](https://github.com/nRF24/RF24/commit/8ea5127078394591a0af5b409c38fa11cb0677d9)
-
-[RF24v1.2.0]: https://github.com/nRF24/RF24/compare/v1.1.7...RF24v1.2.0
-
-Full commit diff: [`v1.1.7...RF24v1.2.0`][RF24v1.2.0]
-
-## New Contributors
-
-- \@pfeerick made their first contribution
-- \@valeros made their first contribution
-
-## [1.1.7] - 2016-08-12
-
-### <!-- 1 --> 🚀 Added
-
-- Add interrupts to SPIDEV by \@TMRh20 in [`d705abd`](https://github.com/nRF24/RF24/commit/d705abd4073defa0a5d338f6d58a604597f2aff7)
-- Add sudo when linking for old lib name via remote by \@TMRh20 in [`87f3d11`](https://github.com/nRF24/RF24/commit/87f3d11033c70e9ca5032295ca5ffd5cdc665f7f)
-- Support for ATXMega256D3 by \@akatran in [`990f3f7`](https://github.com/nRF24/RF24/commit/990f3f739ece5b5f6c25dc25779a9e2c7d7b014b)
-- Merge pull request \#238 from akatran/master by \@TMRh20 in [#238](https://github.com/nRF24/RF24/pull/238)
-- Merge pull request \#267 from mz-fuzzy/doc_update by \@TMRh20 in [#267](https://github.com/nRF24/RF24/pull/267)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Remove the custom PROGRAM SPACE definitions and use avr/pgmspace! by \@akatran in [`a8f100b`](https://github.com/nRF24/RF24/commit/a8f100b27c902019c852c20c8999ee5195d0a2e4)
-- Documentation update: by \@martin-mat in [`3f54a0a`](https://github.com/nRF24/RF24/commit/3f54a0aec951426cc66046ccd8f4dccaab657635)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix progmem inclusion \#252 by \@TMRh20 in [`372562a`](https://github.com/nRF24/RF24/commit/372562a2ffb81f43504ff35fdd17ec98fbca26e8)
-- Fix path to platform specific files in library.json for platformio by \@rnovacek in [`13ce2bb`](https://github.com/nRF24/RF24/commit/13ce2bb58b1fdfa5e55d1b32d69ef8c31582e3b6)
-- Merge pull request \#263 from rnovacek/master by \@TMRh20 in [#263](https://github.com/nRF24/RF24/pull/263)
-
-### <!-- 9 --> 🗨️ Changed
-
-- \#234 by \@TMRh20 in [`2b558d0`](https://github.com/nRF24/RF24/commit/2b558d05c8656df26fa3d4aab87c54785e94b526)
-- Change CONFIG to NRF_CONFIG per \#212 by \@TMRh20 in [`b250082`](https://github.com/nRF24/RF24/commit/b250082605a8fafbc866f61e21a50c351698a819)
-- Duplicate read NRF_CONFIG per \#203 in powerUp() by \@TMRh20 in [`9708f72`](https://github.com/nRF24/RF24/commit/9708f720ebaf372f4d90104577be5ee481ab1cc0)
-- ATTiny 861 support per \#180 by \@TMRh20 in [`970309d`](https://github.com/nRF24/RF24/commit/970309d18ca0ebcb7d23cedc27dc398529476e34)
-- Makefile and project structure improvements by \@martin-mat in [`3b13827`](https://github.com/nRF24/RF24/commit/3b138276e919c96d7d578273f5b113e21d30e985)
-- Configure - cli parameters by \@martin-mat in [`891becd`](https://github.com/nRF24/RF24/commit/891becdf89cd660db865b9ae8f5acaddc713e891)
-- Python wrapper cross-compilation refinements by \@martin-mat in [`2c6d28a`](https://github.com/nRF24/RF24/commit/2c6d28af43654736df9ebdccb3388c648406889b)
-- Configured compiler binary to be respected in setup.py by \@martin-mat in [`4d94f59`](https://github.com/nRF24/RF24/commit/4d94f5931338f873c327692b77063ef4df12cf0c)
-- Makefile improvemets rebasing leftovers - BBB -> SPIDEV by \@martin-mat in [`87b5545`](https://github.com/nRF24/RF24/commit/87b554518b04a2990566ae61c61c79c134eb09f5)
-- Makefile: 'configure' target added by \@martin-mat in [`46824af`](https://github.com/nRF24/RF24/commit/46824af345f4c567348b31d0708b6fe7d5f0be7e)
-- Linux library name backward compatibilty using simlink by \@martin-mat in [`ef1914b`](https://github.com/nRF24/RF24/commit/ef1914b47506750d26ddbd89110700b689fea1c2)
-- Pthread switch added to compile phase by \@martin-mat in [`0f928c0`](https://github.com/nRF24/RF24/commit/0f928c043c6cb3b8f939723c301059ff41329938)
-- SPIDEV fix non-root user segfault after startup by \@TMRh20 in [`874fee8`](https://github.com/nRF24/RF24/commit/874fee84452fa6ee09da99139a3746754d28c276)
-- RPi Bugfix: False Hardware Failure indication by \@TMRh20 in [`5d49fd6`](https://github.com/nRF24/RF24/commit/5d49fd6bfeb8682415bfda23e97b9d1c12b9b5e3)
-- RPi Interrupts w/SPIDEV Bugfix: Enable mutex lock by \@TMRh20 in [`540e10d`](https://github.com/nRF24/RF24/commit/540e10d588f630ca74bf715d3542d65dee72156d)
-- Revert NRF_CONFIG in printDetails to CONFIG by \@TMRh20 in [`406265e`](https://github.com/nRF24/RF24/commit/406265e317716f7cd8aaf98b23f1f6f744199ac6)
-- Spidev fix: don't close spidev if not open before by \@martin-mat in [`4c52feb`](https://github.com/nRF24/RF24/commit/4c52feb23cdbf12a5e6fc82c10156825255ff802)
-- Avoid memory corruption when calling RF24::read(0) on linux machines by \@martin-mat in [`2f2cb2b`](https://github.com/nRF24/RF24/commit/2f2cb2bbbb404a26e4c21bd5b0a5e8b22128df68)
-- Merge branch 'makefile_improvements' of https://github.com/TMRh20/RF24 into master by \@martin-mat in [`4507fd1`](https://github.com/nRF24/RF24/commit/4507fd15c67b277e18cb953112cf5c885e7f5dec)
-- Linux_examples makefile: move libs after source files by \@martin-mat in [`061341e`](https://github.com/nRF24/RF24/commit/061341ed5945d7808fd82ab840c6d673bee12389)
-- Makefile/configure - fix of recursive 'make clean' call when using 'make -B' by \@martin-mat in [`6c8e302`](https://github.com/nRF24/RF24/commit/6c8e302ad0abf1a90053246ce7434216fbd17696)
-- Changed ce_pin and csn_pin to uint16_t so the library supports GPIO identifiers higher than 255 (Minnowboard) in [`eb05670`](https://github.com/nRF24/RF24/commit/eb056706e9fba23fe8f2c97c8b46727f15ef8d8c)
-- Change back to default the user setting FAILURE_HANDLING by \@akatran in [`f6e5ee7`](https://github.com/nRF24/RF24/commit/f6e5ee7a69ed5ae2cdd5e33a817e95995c30dc8b)
-- Merge remote-tracking branch 'refs/remotes/TMRh20/master' by \@akatran in [`a9255c8`](https://github.com/nRF24/RF24/commit/a9255c808259138d3b53df5e7db71379e694c000)
-- Merge branch 'master' of https://github.com/TMRh20/RF24 by \@akatran in [`9e71772`](https://github.com/nRF24/RF24/commit/9e717722d83dd74554ff424b7e817409f5df0efa)
-- Update from TMRh20/master and merge with local. by \@akatran in [`ef70a4f`](https://github.com/nRF24/RF24/commit/ef70a4fe7fc1a2c8ebcfab4189a2187c7e891f3d)
-- Update README.md by \@akatran in [`a466b36`](https://github.com/nRF24/RF24/commit/a466b36e6c8497a59f8a52a22f63cb1af415484b)
-- Update compatibility.c by \@akatran in [`4d52e67`](https://github.com/nRF24/RF24/commit/4d52e67a1ffa6b386494ae27c6c8e26bc5ba6610)
-- Update RF24.h - Add comments for github.io by \@akatran in [`22a719f`](https://github.com/nRF24/RF24/commit/22a719fee33e4f9aa0d9caa4150299b2c5d4ad4d)
-- Merge remote-tracking branch 'refs/remotes/TMRh20/master' by \@akatran in [`c4dd23b`](https://github.com/nRF24/RF24/commit/c4dd23b38a14f094fa765368780561e8d0a5eb7f)
-- Revert back (correctly) the README.md by \@akatran in [`db715ad`](https://github.com/nRF24/RF24/commit/db715ad34eb9d82bcf27992c7eb96ceeb0224ed7)
-- Change back the RF24_config.h to be in sync with TMRh20/master by \@akatran in [`a2c7047`](https://github.com/nRF24/RF24/commit/a2c7047be4aa1a5b366ee1da092a17163b69a943)
-- Configure - fix of wrong soname to respect major library version by \@martin-mat in [`a296ce6`](https://github.com/nRF24/RF24/commit/a296ce68af965152d91324f79256905aba0c887a)
-- Linux config: H3 detection and gcc switches. by \@martin-mat in [`244dfb1`](https://github.com/nRF24/RF24/commit/244dfb128ba3ea5010f7d40cea03b8dfd7ccf77b)
-- Change examples_RPi to examples_linux by \@gitgrimbo in [`a69535d`](https://github.com/nRF24/RF24/commit/a69535d9b310c93fde884e4385d17406c89af7d0)
-- Merge pull request \#254 from gitgrimbo/fix-examples-folder-name by \@martin-mat in [#254](https://github.com/nRF24/RF24/pull/254)
-- Change detection for ATXMega256D3 by \@akatran in [`abf4f29`](https://github.com/nRF24/RF24/commit/abf4f29926a8f5461199148e820effad2b96bc5d)
-- Changes to include XMEGA D3 family. by \@akatran in [`bdc7446`](https://github.com/nRF24/RF24/commit/bdc74464249313958c910f66ff9ca957580fb6b4)
-- Merge pull request \#251 from akatran/master by \@Avamander in [#251](https://github.com/nRF24/RF24/pull/251)
-- Update library.properties by \@Avamander in [`4e9f1fb`](https://github.com/nRF24/RF24/commit/4e9f1fb992c73d720cbebdd3755cd64001ffe3e2)
-
-[1.1.7]: https://github.com/nRF24/RF24/compare/v1.1.6...v1.1.7
-
-Full commit diff: [`v1.1.6...v1.1.7`][1.1.7]
-
-## New Contributors
-
-- \@rnovacek made their first contribution
-- \@gitgrimbo made their first contribution
-- \@akatran made their first contribution
-
-## [1.1.6] - 2016-02-20
-
-### <!-- 1 --> 🚀 Added
-
-- Added possibility/demonstration of IRQ pin usage for RPi/Python. by \@martin-mat in [`031d388`](https://github.com/nRF24/RF24/commit/031d3888e837fa2ef23e92e3923ddc10defbcbf8)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix GettingStarted sample by \@SaintGimp in [`81f1c0d`](https://github.com/nRF24/RF24/commit/81f1c0d50365e612fe96f32de573d43f69983584)
-- Fix warning: C++11 requires a space between literal and identifier by \@flavio-fernandes in [`c3a0996`](https://github.com/nRF24/RF24/commit/c3a0996b20fa17aa7f4f58630c3e516b189a6aa9)
-- Fix for \#217 GettingStarted enhancement. by \@wmarkow in [`d0bbfaa`](https://github.com/nRF24/RF24/commit/d0bbfaa28fe8114a46e72d76475763cc20f7e10e)
-- Fix for \#213. by \@wmarkow in [`5a0ec58`](https://github.com/nRF24/RF24/commit/5a0ec58516a85d77163241a824623e96a4602d6a)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Changed serial baudrate by \@Avamander in [`842d048`](https://github.com/nRF24/RF24/commit/842d0489a67d1f2692b731133df7555e49d521a7)
-- Updated serial baudrate by \@Avamander in [`14b8fb0`](https://github.com/nRF24/RF24/commit/14b8fb0b5acdbd68da0e01e87970ca019adfde7b)
-- Merge branch 'master' of https://github.com/TMRh20/RF24 by \@TMRh20 in [`c9feaf5`](https://github.com/nRF24/RF24/commit/c9feaf5161b5aa928a12a45f0314b81c880ec1cb)
-- Checking for wrong return value in detachInterrupt of pthread_cancel and close. by \@Oitzu in [`72fe373`](https://github.com/nRF24/RF24/commit/72fe373e312e5f1a44f12476fd6648494ae7418f)
-- Python wrapper now respects RPI/SPIDEV/MRAA RF24 configuration. by \@martin-mat in [`95926b2`](https://github.com/nRF24/RF24/commit/95926b2c9aeedd1cdae011a1bb0f54f40b9a7726)
-- Merge pull request \#200 from SaintGimp/FixGettingStarted by \@Avamander in [`58f6d8d`](https://github.com/nRF24/RF24/commit/58f6d8dbc5d6f0e8a25a5a6dd680aa62a520fab3)
-- Merge pull request \#210 from flavio-fernandes/topic/fix_warning by \@Avamander in [`47435fd`](https://github.com/nRF24/RF24/commit/47435fdd3489e5550aa31487f4556da832955bfc)
-- Fixed function to clear interrupt bits first. by \@ab316 in [`0242486`](https://github.com/nRF24/RF24/commit/0242486985504f34c11a4fb945c641bc04878b96)
-- Merge pull request \#206 from ab316/master by \@Avamander in [`f043cb7`](https://github.com/nRF24/RF24/commit/f043cb780db1ea519b387dbbc7339836ec314497)
-- Update library.properties by \@Avamander in [`50cf850`](https://github.com/nRF24/RF24/commit/50cf850a87ddbf422ce1f527e901601d4d15f5ec)
-- Merge pull request \#218 from wmarkow/217_fix by \@Avamander in [`8c7adbc`](https://github.com/nRF24/RF24/commit/8c7adbcc4cb0de89060325ac854b2e75cdfee2b3)
-- Merge pull request \#216 from wmarkow/213_fix by \@Avamander in [`99ada7b`](https://github.com/nRF24/RF24/commit/99ada7ba2dd8790080d3cdb319a240d80da93523)
-- Revert "Fix for \#217 GettingStarted enhancement." by \@Avamander in [`df225d6`](https://github.com/nRF24/RF24/commit/df225d641b0fc563b3eae15af96dc741c42092a6)
-- Merge pull request \#219 from TMRh20/revert-218-217_fix by \@Avamander in [`fd89aae`](https://github.com/nRF24/RF24/commit/fd89aae4f0c65874453478d3d65deff70f384196)
-
-[1.1.6]: https://github.com/nRF24/RF24/compare/v1.1.5...v1.1.6
-
-Full commit diff: [`v1.1.5...v1.1.6`][1.1.6]
-
-## New Contributors
-
-- \@wmarkow made their first contribution
-- \@flavio-fernandes made their first contribution
-- \@ab316 made their first contribution
-- \@SaintGimp made their first contribution
-
-## [1.1.5] - 2016-01-07
-
-### <!-- 1 --> 🚀 Added
-
-- Add bcm2835 lib v1.48 by \@TMRh20 in [`18daa4c`](https://github.com/nRF24/RF24/commit/18daa4c4ddaef1c5bb3048c0a891c45030955c46)
-- Added comments to RPi interrupt files. by \@Oitzu in [`2bb6f32`](https://github.com/nRF24/RF24/commit/2bb6f325f00b3427a0dc850c8e23798c05a1ffe9)
-- Add mutex locking to SPI functions for RPi by \@TMRh20 in [`715edc5`](https://github.com/nRF24/RF24/commit/715edc5e39ca04e352e8d6c26784972c13b9a1e8)
-- Add 'static' to void in spi.h by \@TMRh20 in [`ed9ae08`](https://github.com/nRF24/RF24/commit/ed9ae08dbab6036fd42b1376462d74a94cf90bf4)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Update RPi call_response_int2 example by \@TMRh20 in [`bf06db9`](https://github.com/nRF24/RF24/commit/bf06db96b94c582360cee454a1210f5e4851b5ad)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fix Warning. ‘void* interruptHandler(void*)’ declared ‘static’ but never defined. by \@Oitzu in [`409cbf7`](https://github.com/nRF24/RF24/commit/409cbf78ee5e779f3abb2c2cc6a3f22abc809fba)
-- Deadlocks due to RPi SPI mutex code by \@TMRh20 in [`9a5ea80`](https://github.com/nRF24/RF24/commit/9a5ea80cacf9f50cce0b1600da4b5a55596b1011)
-- Fixes for last commit by \@TMRh20 in [`a57fafe`](https://github.com/nRF24/RF24/commit/a57fafe017961b8cfdef2ccac3d764721c42e62d)
-- Fix per \#183 by \@TMRh20 in [`9e68f9e`](https://github.com/nRF24/RF24/commit/9e68f9e133f426322d9b512239fc952b2dd3b1b9)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Initial commit for interrupts based on wiringPi. by \@Oitzu in [`67d0285`](https://github.com/nRF24/RF24/commit/67d0285fc5ceae2b6f50f453ee9926490e629bd4)
-- Merged TMRh20's changes. by \@Oitzu in [`f4a6073`](https://github.com/nRF24/RF24/commit/f4a6073bc9a34717d7c09d07bbb466bf6d32c6c9)
-- Moving pthread to shared linker flags. by \@Oitzu in [`e83bc9a`](https://github.com/nRF24/RF24/commit/e83bc9affb30c6a1c90bf63de72d19aabcd47162)
-- Merge pull request \#173 from Oitzu/master by \@TMRh20 in [`a381194`](https://github.com/nRF24/RF24/commit/a381194bf0a5e1e1ecb06a7f0c502791e049d77c)
-- Mutex handling for interrupts on RPi by \@TMRh20 in [`243e25f`](https://github.com/nRF24/RF24/commit/243e25f23a6d3ff4f3d57ec2f89419ac84d36c16)
-- Move interrupt examples, add new int examples by \@TMRh20 in [`2c4d199`](https://github.com/nRF24/RF24/commit/2c4d1991b1a314e7f0ad5a3d808761e36002c2b5)
-- Initial commit RPI-SPI-Transactions. by \@Oitzu in [`e1fe438`](https://github.com/nRF24/RF24/commit/e1fe43814cca7af57b7515f999f70356b51fd3b1)
-- Implement detachInterrupt method. See \#173 by \@Oitzu in [`b615951`](https://github.com/nRF24/RF24/commit/b615951a3d59ed258b61daa40f3a090b02cb6a00)
-- Minor chgs to mirror Arduino SPI transaction API by \@TMRh20 in [`f285fde`](https://github.com/nRF24/RF24/commit/f285fde257438e7fe482ff4c6dc03f0de185b7e5)
-- One more per \#183 by \@TMRh20 in [`d37d030`](https://github.com/nRF24/RF24/commit/d37d030495483a2c6522b2f259b46974d3d0f623)
-- Merge remote-tracking branch 'refs/remotes/origin/Interrupts' by \@TMRh20 in [`3e8147a`](https://github.com/nRF24/RF24/commit/3e8147a1a150f59908d3e2bb43719193d54a54fc)
-- RPI2 autodetection by \@yozik04 in [`d7cacdc`](https://github.com/nRF24/RF24/commit/d7cacdc20bbb89632f8b9ee1a1bba439cf80de79)
-- RPI2 autodetection in examples by \@yozik04 in [`b417d58`](https://github.com/nRF24/RF24/commit/b417d58ce10cf4f18bcffa8b6869c8b53d729e4f)
-- Merge pull request \#179 from yozik04/master by \@TMRh20 in [`1c78dd0`](https://github.com/nRF24/RF24/commit/1c78dd007220687f6c262b970c7b7e65819ddece)
-- Update library.properties by \@Avamander in [`8115a34`](https://github.com/nRF24/RF24/commit/8115a3436f37685e83f4ddde1eb26ba1962829ea)
-
-[1.1.5]: https://github.com/nRF24/RF24/compare/v1.1.4...v1.1.5
-
-Full commit diff: [`v1.1.4...v1.1.5`][1.1.5]
-
-## New Contributors
-
-- \@yozik04 made their first contribution
-- \@Oitzu made their first contribution
-
-## [1.1.4] - 2015-12-14
-
-### <!-- 3 --> 🗑️ Removed
-
-- Doc Update: Add current info to news by \@TMRh20 in [`f6fa0be`](https://github.com/nRF24/RF24/commit/f6fa0be4931149050d340695a15ddaa15afcf124)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fixed inconsistent documentation, added Tinyx313 pin map by \@zador-blood-stained in [`b5228f3`](https://github.com/nRF24/RF24/commit/b5228f3775bb520e90fe40aff49b1f28b47cf7f7)
-- Fix broken transfer example by \@TMRh20 in [`13c069c`](https://github.com/nRF24/RF24/commit/13c069caf1e74021da0517d349741d3cb2fb1e7d)
-
-### <!-- 8 --> 📝 Documentation
-
-- Merge pull request \#155 from zador-blood-stained/master by \@TMRh20 in [`4554f73`](https://github.com/nRF24/RF24/commit/4554f739e7087852a7375b29172df7e5df03838c)
-- Update .h file per doc changes by \@TMRh20 in [`e192580`](https://github.com/nRF24/RF24/commit/e192580383d332bb7e2398a7ae057c41b1918d87)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Python3 support added by \@martin-mat in [`cda3e18`](https://github.com/nRF24/RF24/commit/cda3e18b0d011fca4e65100918ab6bb3477655b1)
-- Merge pull request \#164 from mz-fuzzy/python3 by \@TMRh20 in [`90dd53e`](https://github.com/nRF24/RF24/commit/90dd53e1abb68c72bf5035a8c9497d83189fb680)
-- Update library.properties by \@Avamander in [`e888f55`](https://github.com/nRF24/RF24/commit/e888f55864485f4d919f7753ddb479702264fb1f)
-
-[1.1.4]: https://github.com/nRF24/RF24/compare/v1.1.3...v1.1.4
-
-Full commit diff: [`v1.1.3...v1.1.4`][1.1.4]
-
-## [1.1.3] - 2015-10-31
-
-### <!-- 3 --> 🗑️ Removed
-
-- ESP8266 printDetails, Docs by \@TMRh20 in [`aeb8b42`](https://github.com/nRF24/RF24/commit/aeb8b427304af7c5d45e03330a013ae98f895040)
-- Removed usage of hardcoded SS pins by \@zador-blood-stained in [`1376fbd`](https://github.com/nRF24/RF24/commit/1376fbd8ce63c730068d2b6c7d160b990b497a3d)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Update gettingstarted.cpp by \@cguzmanceti in [`f3cc137`](https://github.com/nRF24/RF24/commit/f3cc137cb669f5ae61ecd45c89d7e4946c87d5d8)
-- Merge pull request \#153 from cguzmanceti/patch-1 by \@TMRh20 in [`0bf4998`](https://github.com/nRF24/RF24/commit/0bf499884f6c1a2cd6e251b70c211cd596a478ea)
-- Update gettingstarted_call_response.cpp by \@cguzmanceti in [`c5fdf1b`](https://github.com/nRF24/RF24/commit/c5fdf1be64606b11dd5f07ba05204d38c4768102)
-- Merge pull request \#154 from cguzmanceti/patch-2 by \@TMRh20 in [`dfb2395`](https://github.com/nRF24/RF24/commit/dfb2395557ad93d659018dea5efd91e0bfeb46e4)
-- ATTiny2313/4313 support by \@zador-blood-stained in [`ac0ff44`](https://github.com/nRF24/RF24/commit/ac0ff44a90d80d632aad3fba983c5020b5773535)
-- Merge pull request \#152 from zador-blood-stained/master by \@TMRh20 in [`07e8362`](https://github.com/nRF24/RF24/commit/07e83623032c5aeb78b961cad4fe5491092860ef)
-- Change printf to cout in RPi examples by \@TMRh20 in [`3652890`](https://github.com/nRF24/RF24/commit/365289022b60a951d99442f138daebfe330924bf)
-
-[1.1.3]: https://github.com/nRF24/RF24/compare/v1.1.2...v1.1.3
-
-Full commit diff: [`v1.1.2...v1.1.3`][1.1.3]
-
-## New Contributors
-
-- \@cguzmanceti made their first contribution
-- \@zador-blood-stained made their first contribution
-
-## [1.1.2] - 2015-10-20
-
-### <!-- 9 --> 🗨️ Changed
-
-- Delete FAQ by \@Avamander in [`69c1f3c`](https://github.com/nRF24/RF24/commit/69c1f3cc402e51e632e456f592dfeb3351dd6c6c)
-- Update library.properties by \@Avamander in [`a045c5a`](https://github.com/nRF24/RF24/commit/a045c5ac3c3f3304b793d8baeffa066d2a88e536)
-- Made possible many examples to run in 512 bytes ram chips, fixed few typos, missing F() macro calls and other minor improvements by \@fab672000 in [`0483d36`](https://github.com/nRF24/RF24/commit/0483d3604116f0ae79cc17ba0d522f58b968333c)
-- Restored back multicast pingpair example from previous maniacbug fork by \@fab672000 in [`aab3a52`](https://github.com/nRF24/RF24/commit/aab3a529f898ec40e3d62510cd535d5e2d8a5ac4)
-- Merge pull request \#141 from fab672000/master by \@Avamander in [`46ccceb`](https://github.com/nRF24/RF24/commit/46ccceb65f98dd505b9eb34ce4d5f4fd56c84d5d)
-- Update library.properties by \@Avamander in [`7a44681`](https://github.com/nRF24/RF24/commit/7a446813de8278117920aa8c0ef06da599a94280)
-
-[1.1.2]: https://github.com/nRF24/RF24/compare/v1.1.1...v1.1.2
-
-Full commit diff: [`v1.1.1...v1.1.2`][1.1.2]
-
-## New Contributors
-
-- \@fab672000 made their first contribution
-
-## [1.1.1] - 2015-10-01
-
-### <!-- 9 --> 🗨️ Changed
-
-- Increment version - test by \@TMRh20 in [`b305bb4`](https://github.com/nRF24/RF24/commit/b305bb4bba4c2a3db65f07f5c21d67923508d9df)
-
-[1.1.1]: https://github.com/nRF24/RF24/compare/v1.0.1...v1.1.1
-
-Full commit diff: [`v1.0.1...v1.1.1`][1.1.1]
-
-## [1.0.1] - 2015-10-01
-
-### <!-- 9 --> 🗨️ Changed
-
-- Increment library.properties by \@TMRh20 in [`c98f396`](https://github.com/nRF24/RF24/commit/c98f39633070d02c3a1142094114390c93b6eb14)
-- Merge branch 'Updates' by \@TMRh20 in [`a4f412c`](https://github.com/nRF24/RF24/commit/a4f412c37f9178f3bee449a92d985398c53ae492)
-
-[1.0.1]: https://github.com/nRF24/RF24/compare/v1.0...v1.0.1
-
-Full commit diff: [`v1.0...v1.0.1`][1.0.1]
-
-## [1.0] - 2015-10-01
-
-### <!-- 1 --> 🚀 Added
-
-- Added by \@maniacbug in [`de083c9`](https://github.com/nRF24/RF24/commit/de083c964d9aeeb9fda7485c39fed27443cd617c)
-- Added a small documentation build system by \@maniacbug in [`0b89d37`](https://github.com/nRF24/RF24/commit/0b89d37f19176f14fbbb8e35bced7c54b5452729)
-- Added new star-topology example by \@maniacbug in [`37d8e8b`](https://github.com/nRF24/RF24/commit/37d8e8b17d4672d297f3ffe1d031008f862a2ef4)
-- Added an indication of which pipe a message came from. Fixed a bug where pipes 2+ were not by \@maniacbug in [`c8ed556`](https://github.com/nRF24/RF24/commit/c8ed556aba2259a2c658eecf9ef38494918647ce)
-- Added new sample, based on pingpair by \@maniacbug in [`997140e`](https://github.com/nRF24/RF24/commit/997140e0d46b6ec98da293a6a280bfd413bdb050)
-- Added ack payload. Added a sample using pingpair as a base with minimal changes. by \@maniacbug in [`79628e7`](https://github.com/nRF24/RF24/commit/79628e7849cc3b9f92bc7203ed3d8fbe49d8e537)
-- Added powerDown(). by \@maniacbug in [`b697fd4`](https://github.com/nRF24/RF24/commit/b697fd4e79453c2450b88a441e2e1a36e78442fc)
-- Added server time to printout. Power disable/enable before/after sleeping. Changed timer to 4s. by \@maniacbug in [`ee4568e`](https://github.com/nRF24/RF24/commit/ee4568ede4108e19cfd5426841a7dd20c489e3c3)
-- Added a full constructor for payload_t by \@maniacbug in [`4f6c4c9`](https://github.com/nRF24/RF24/commit/4f6c4c909e3534dcf63051d49fcee1a3237d13f8)
-- Added relay role, and tweaked base to work with it by \@maniacbug in [`2e7ea67`](https://github.com/nRF24/RF24/commit/2e7ea6709325e7a517ff5dadbdf993e4aa7d302e)
-- Added self-healing ping offset to leaf node. Made timeout more parallelized by \@maniacbug in [`7b71380`](https://github.com/nRF24/RF24/commit/7b7138027893b1e31ba49398e314a64890a908ad)
-- Added more documentation by \@maniacbug in [`6ec7640`](https://github.com/nRF24/RF24/commit/6ec7640a7a6f9cccacb313a44a6516fef6457148)
-- Added extra debugging readability by \@maniacbug in [`badc86c`](https://github.com/nRF24/RF24/commit/badc86cfe0bc247fab6a0bec2874413b9dc7e443)
-- Added carrier detect and auto-ack disable, and an example to use it by \@maniacbug in [`bee284f`](https://github.com/nRF24/RF24/commit/bee284f9c5478880a78c019dd1f565e4fc1ffd2c)
-- Added carrier detect and auto ack enable/disable by \@maniacbug in [`a6e7444`](https://github.com/nRF24/RF24/commit/a6e7444059c516115a31f988e657be5672a1ed71)
-- Added setDataRate() by \@maniacbug in [`4131420`](https://github.com/nRF24/RF24/commit/4131420de79456be80e218523bf1c3c0ab36b2a1)
-- Added 3rd FTDI port for my own use by \@maniacbug in [`af9261c`](https://github.com/nRF24/RF24/commit/af9261cf930da1733c43466a2e88a34556ed281f)
-- Added setCRCLength by \@maniacbug in [`34efd5a`](https://github.com/nRF24/RF24/commit/34efd5ac94a5c5fd173a26fd11d5ef9b50c25b65)
-- Added a new example by \@maniacbug in [`ad99581`](https://github.com/nRF24/RF24/commit/ad99581285b9097fd90de288e73a97843a1091ee)
-- Added led_remote to docs by \@maniacbug in [`a62338f`](https://github.com/nRF24/RF24/commit/a62338f3a7a855aca9f8af7cd7d3479faa7f149e)
-- Add RF_SETUP to printDetails by \@maniacbug in [`748fde2`](https://github.com/nRF24/RF24/commit/748fde239b8b363bad0509bcf8a04ab2c7c53c81)
-- Added Jamfile for led_remote by \@maniacbug in [`8d5f020`](https://github.com/nRF24/RF24/commit/8d5f020c78d61a118c3e00be2f1dea43a727d667)
-- Add dynpd/feature to printDetails by \@maniacbug in [`04e7277`](https://github.com/nRF24/RF24/commit/04e72775bb4d92e39ea51bc63b0018dd6eaff5bb)
-- Added setRetries() by \@maniacbug in [`a22906f`](https://github.com/nRF24/RF24/commit/a22906f9617215f0448daa3e9c6c871e0ab0c9b1)
-- Adding new example pingpair_dyn for dynamic payloads by \@maniacbug in [`98fbd44`](https://github.com/nRF24/RF24/commit/98fbd44111f11063b4c4cfbcf642dbaac00159d0)
-- Added working test by \@maniacbug in [`77411b4`](https://github.com/nRF24/RF24/commit/77411b4ec57839b55b0dfb25c0296e0a8c4b3f9f)
-- Added a test script to control the test, using python. by \@maniacbug in [`22b4c55`](https://github.com/nRF24/RF24/commit/22b4c558cd9c5c922ca84d7781e058d53d47bc9c)
-- Added a second test configuration by \@maniacbug in [`c13db8f`](https://github.com/nRF24/RF24/commit/c13db8f42db76a78ba79fa244271d6beba1c425c)
-- Added 3rd test case, static payload by \@maniacbug in [`d436895`](https://github.com/nRF24/RF24/commit/d436895f7c97a4c862299431bbad29d5f939c6f2)
-- Adds constantness to method declarations and arguments where possible. by \@gcopeland in [`b1a7dc7`](https://github.com/nRF24/RF24/commit/b1a7dc7d54d51d5ffa7291ecbd6d9dd0f2e53b64)
-- Added two default values to the RF24 constructor; speed and channel. by \@gcopeland in [`aac2c3d`](https://github.com/nRF24/RF24/commit/aac2c3dba33b163521dc6a00bdb7d81761af1fbc)
-- Adds explicit CRC width and PA level. Changes hardware initialization by \@gcopeland in [`1581647`](https://github.com/nRF24/RF24/commit/158164746b59d32eb10a8017e1ad03b1f858df86)
-- Added another test of a simpler calling pattern. No IRQ, no dynamic payload or ack packet. by \@maniacbug in [`89180f2`](https://github.com/nRF24/RF24/commit/89180f284404e0d598675b8c0ccc5edd301f89b7)
-- Add getDataRate, add DISABLED to data rate enum by \@maniacbug in [`8f17e63`](https://github.com/nRF24/RF24/commit/8f17e63a22ac01f03a3923b139799baec8256443)
-- Added back in gcopeland's additional debugging info, with readable values. by \@maniacbug in [`4c21ab6`](https://github.com/nRF24/RF24/commit/4c21ab6ad099c193f1d47822c4e13fc9c77be9d0)
-- Added FAQ page to docs by \@maniacbug in [`7aeaf0d`](https://github.com/nRF24/RF24/commit/7aeaf0d37329db116e8e363098f61b0b27bbf132)
-- Added more information about whether the write was successful. by \@maniacbug in [`dceef7b`](https://github.com/nRF24/RF24/commit/dceef7b45ec2ae29025089fea2fa9dcdf411aea0)
-- Added new example to go along with Getting Started tutorial blog post. by \@maniacbug in [`3a2d94b`](https://github.com/nRF24/RF24/commit/3a2d94b698c463f0b3168d7080ea1398bc7a6303)
-- Added new example to documentation by \@maniacbug in [`d437163`](https://github.com/nRF24/RF24/commit/d4371639e612e8c74a9dcfb3148118439a6a9dac)
-- Added example for Maple by \@maniacbug in [`a6bf911`](https://github.com/nRF24/RF24/commit/a6bf911f5a99253c7b718d4c119f5a65d4f59d59)
-- Added new jamfile to this example by \@maniacbug in [`19fa395`](https://github.com/nRF24/RF24/commit/19fa3954c0d452f43ef9b8e4b8afca47d8b98a41)
-- Added \#error to printf for examples that require Arduino by \@maniacbug in [`26ea458`](https://github.com/nRF24/RF24/commit/26ea4583cdebbc219b5f4460096044d911874e9d)
-- Add isValid by \@maniacbug in [`ebcd0d1`](https://github.com/nRF24/RF24/commit/ebcd0d1d0b3061fcb57444e1dbe5829ef25705cd)
-- Added writeFast() cmd - fill FIFO or return 0 by \@TMRh20 in [`281ace4`](https://github.com/nRF24/RF24/commit/281ace4ba24fb9c0cf814572c72752eebd3b8d95)
-- Add powerUp to begin(), increase powerUp delay by \@TMRh20 in [`3455e48`](https://github.com/nRF24/RF24/commit/3455e489f4c88504bd65b6b5edf10282d5a47ab3)
-- Add optional write timeout/failure handling by \@TMRh20 in [`327f060`](https://github.com/nRF24/RF24/commit/327f0609cf7b52b70accccc175b5809dd5074704)
-- Add ATTiny example, change Minimal define by \@TMRh20 in [`d9c7df3`](https://github.com/nRF24/RF24/commit/d9c7df3ac9f4fb40376f6e299d833ae6add6802a)
-- Add rxFifoFull() function, Only flush tx w ack_plds by \@TMRh20 in [`82629d4`](https://github.com/nRF24/RF24/commit/82629d4d3716f05be677323fd73c7a1df3308fd9)
-- Add RPi B+ info to main examples and readme by \@TMRh20 in [`63b672c`](https://github.com/nRF24/RF24/commit/63b672c92963426377f722bfbc0e1c30038d6b62)
-- Add readme for python wrapper by \@TMRh20 in [`cd59648`](https://github.com/nRF24/RF24/commit/cd596482156afff4f2f5e8a65d3ae0d897015a22)
-- Add new RPi installer info to readme by \@TMRh20 in [`6bf37cd`](https://github.com/nRF24/RF24/commit/6bf37cdf5523c61d91a3ee09260f94ef26034b09)
-- Adding SPI enum to RPi python wrapper by \@martin-mat in [`dcdc35d`](https://github.com/nRF24/RF24/commit/dcdc35d70deaeba951769492213636d15d9581ec)
-- Add changes from doc update by \@TMRh20 in [`0b2d8dd`](https://github.com/nRF24/RF24/commit/0b2d8ddb2dbe996b60716482860a67407de6537b)
-- Adding LittleWire support to RF24 by \@lnxbil in [`9b9a573`](https://github.com/nRF24/RF24/commit/9b9a57348d6fe3b9a1c238bc5598c5f283e524e7)
-- Address fix for attiny example sketch by \@ax7884 in [`ba161a3`](https://github.com/nRF24/RF24/commit/ba161a3b25388988b178570cc859894df2d1d186)
-- Support RPi 2 w/bcm2835.c version 1.39 by \@mannkind in [`25d379c`](https://github.com/nRF24/RF24/commit/25d379c187d673c775a7d68702f6f811405f1bdc)
-- Add updated makefile for latest changes by \@TMRh20 in [`f420557`](https://github.com/nRF24/RF24/commit/f4205573b4c40907318e9ddbbabf094c55b3270d)
-- Add include for nanosleep \#69 by \@TMRh20 in [`30ef8dc`](https://github.com/nRF24/RF24/commit/30ef8dc58aa19b0d1ba0819b7e4e18bd8b5a3071)
-- Add a few links to RF24 docs for related projects by \@TMRh20 in [`c83f0f2`](https://github.com/nRF24/RF24/commit/c83f0f26ff65c66754037ce959a3485c55404e02)
-- Added ```busNo``` passing to mraa::Spi() object creation call so that SPI bus number now can be defined by user when instatiating RF24 object by \@prophet-roshak in [`dd4b86a`](https://github.com/nRF24/RF24/commit/dd4b86aaac26b3c59912ebd93e8912ce208aee88)
-- Add generic pin config for RPi, minor doc changes by \@TMRh20 in [`4cb2c5c`](https://github.com/nRF24/RF24/commit/4cb2c5c5a737221ed8855c20c495143c0da0bddb)
-- Add RPi pin config to main page per \#89 by \@TMRh20 in [`7fdc708`](https://github.com/nRF24/RF24/commit/7fdc708b4ff912825b513210142c8b4bd387bd3f)
-- Add SPI transaction code from Ralph Doncaster by \@TMRh20 in [`b1b8cad`](https://github.com/nRF24/RF24/commit/b1b8caddfe02b0876fc928fbadab2e6f20db4e2c)
-- Add transaction code to remaining functions by \@TMRh20 in [`64da088`](https://github.com/nRF24/RF24/commit/64da08852c1537eab7e10314870e9943fe5172fa)
-- Added getChannel Method to allow for verification of the configured channel by \@komby in [`c4d222c`](https://github.com/nRF24/RF24/commit/c4d222ce0db216b7e1c372c587e9b568c6af4f79)
-
-### <!-- 3 --> 🗑️ Removed
-
-- Removed the line that set the payload size to 8 in begin(). Reduced some ints to uint8_t. Added some more debugging info. by \@maniacbug in [`dfb2faa`](https://github.com/nRF24/RF24/commit/dfb2faa8412ac7c64abd4da8409301c622c64ed1)
-- Removed ping/pong. Now tx just sends and rx just sends ack payload by \@maniacbug in [`38392fa`](https://github.com/nRF24/RF24/commit/38392fa5f46e945afbfe7e7962a7d94702e9a727)
-- Removed 'ackpacket' example. It was never working by \@maniacbug in [`f9b664c`](https://github.com/nRF24/RF24/commit/f9b664cd34834885eb383fd166921239e39f065e)
-- Removed power_all/enable/disable, useless. Added a multiples of the wakeup. by \@maniacbug in [`4ef1f4b`](https://github.com/nRF24/RF24/commit/4ef1f4b8e656c1e7b8b98f455517879a56c6a9a2)
-- Removed unused file by \@maniacbug in [`ce881ba`](https://github.com/nRF24/RF24/commit/ce881ba0dcd5f06fc302c55cd02e4bdc52b87051)
-- Removed method argument const qualifiers. by \@gcopeland in [`85c0f57`](https://github.com/nRF24/RF24/commit/85c0f57e3fa180cf047704cd1ed34eecb82f8b51)
-- Merge branch 'p_enable' into constremove by \@gcopeland in [`542c46c`](https://github.com/nRF24/RF24/commit/542c46c0c68eb67a5e9e1f3f970cc27f4e416ac1)
-- Merge gcopeland/constremove by \@maniacbug in [`602d962`](https://github.com/nRF24/RF24/commit/602d96264adcf6bc003cd7a7902ce0ae200cffae)
-- SPI bus speed divider to 4, suggested by Greg Copeland. Also removed duplicated spi setup out of begin(), as it's all in csn() by \@maniacbug in [`a28e236`](https://github.com/nRF24/RF24/commit/a28e2361fc1bab48117cff68d07ab9ee9951948f)
-- Refactor pingpair_test to remove all serial io from within the irq handler, as necessitated by Arduino 1.0 by \@maniacbug in [`dc48235`](https://github.com/nRF24/RF24/commit/dc48235343acae2e23a16278b24aa96665fea04b)
-- Remove prog_char, for compliance with gcc 4.6.1 by \@maniacbug in [`f6e59b9`](https://github.com/nRF24/RF24/commit/f6e59b9de8d8424c3a1daecfbdafdcbfcd85ccac)
-- High Speed Data Transfers/Optimization by \@TMRh20 in [`4cf0fb0`](https://github.com/nRF24/RF24/commit/4cf0fb0c5adc305d40547f42366161e809122b94)
-- - Slight modification to reUseTX cmd by \@TMRh20 in [`77b1e2c`](https://github.com/nRF24/RF24/commit/77b1e2c1400e755d13bfd9345bd235075b056ad4)
-- Ext. timeout hang, examples, board support by \@TMRh20 in [`2f7e448`](https://github.com/nRF24/RF24/commit/2f7e4489bad411ee79f068b593c83c59c1f8c515)
-- RPi SPI functionality and RPi fix for startWrite by \@TMRh20 in [`6530f95`](https://github.com/nRF24/RF24/commit/6530f954a18731e213efeb967265b612b1087ac5)
-- Due & RPi bugfix - \#9 - root cause resolved by \@TMRh20 in [`2869663`](https://github.com/nRF24/RF24/commit/2869663f7fcdb5389a2c717b704a413944de1b8a)
-- Modify write,startWrite, remove rx buffer flushes by \@TMRh20 in [`1d18015`](https://github.com/nRF24/RF24/commit/1d1801500dc6135eede3921008c4f3d381a80252)
-- Removed wrong flush() on RPi by \@TMRh20 in [`589b2c7`](https://github.com/nRF24/RF24/commit/589b2c76fd7c2cc81f91780c776d996c269e9896)
-- Update the pin layout table and consolidate the RPi readme files. by \@reixd in [`1e8de6e`](https://github.com/nRF24/RF24/commit/1e8de6e88f98a68868f23565ddc6cc524f5eca00)
-- Remove unnecessary delay by \@TMRh20 in [`a12cdca`](https://github.com/nRF24/RF24/commit/a12cdca388a38066eca7cc92d7d4ea7c72fc6bf6)
-- Update readme for installer by \@TMRh20 in [`91c6d21`](https://github.com/nRF24/RF24/commit/91c6d214b8030555efb326b555391a46eba30cab)
-- Fixes and Improvements from large round of testing by \@TMRh20 in [`4d5f014`](https://github.com/nRF24/RF24/commit/4d5f014c0efabe2d638b928eb95b07894531b569)
-- Fix 'features'? per https://github.com/dsbaha \#56 by \@TMRh20 in [`39a6385`](https://github.com/nRF24/RF24/commit/39a63859b0f83b5128eb8377a1d6c9abfcbb20ce)
-- - reset config register to default by \@dsbaha in [`8d5e869`](https://github.com/nRF24/RF24/commit/8d5e8695ceae08d742472c66eb04333cfb89295d)
-- Fix bugs in transfer example by \@TMRh20 in [`0066eec`](https://github.com/nRF24/RF24/commit/0066eece027f84d4478b4d7aff40af439097eb22)
-- Remove trailing slash from docs/Prevent warning by \@TMRh20 in [`e900a9c`](https://github.com/nRF24/RF24/commit/e900a9cc5b097f669e31159f6e964c4b2a9c37dd)
-- SPI/GPIO fixes/changes for MRAA and SPIDEV by \@TMRh20 in [`c1bb29c`](https://github.com/nRF24/RF24/commit/c1bb29c74b4cb2c1f13658665160fb8f247bcef9)
-- Destructor for Linux only, replace bell with null by \@TMRh20 in [`e3f4a6b`](https://github.com/nRF24/RF24/commit/e3f4a6ba1879b8bb30e9b54d57c353d0fa42a34d)
-- Fix/Changes for \#111 & \#112 by \@TMRh20 in [`5acbcbd`](https://github.com/nRF24/RF24/commit/5acbcbd2d1d297804aecdf4f42e82ae2fde33526)
-
-### <!-- 4 --> 🛠️ Fixed
-
-- Fixed a bug where it was writing to the wrong pipe by \@maniacbug in [`93f5cfa`](https://github.com/nRF24/RF24/commit/93f5cface0ebc0b82801ab7741b952578af37f7c)
-- Fixed relay writing pipe. Added id to payload. Made Ping timing a consistent gap by \@maniacbug in [`52ab9e0`](https://github.com/nRF24/RF24/commit/52ab9e0081752725fa2c2aa6b8a823a76c59bc9e)
-- Fixed a bug in setDataRate by \@maniacbug in [`731c472`](https://github.com/nRF24/RF24/commit/731c472abc08540a7cb85cd72819ed3930f1f95f)
-- Fixed led_remote in docs by \@maniacbug in [`bec84a7`](https://github.com/nRF24/RF24/commit/bec84a79075b86c71695e668c5cc281c81d4ec96)
-- Fix bug in openReadingPipe which disallowed pipe 5 by \@maniacbug in [`6e6264b`](https://github.com/nRF24/RF24/commit/6e6264be43e9e95c9b25838ea16377650e8fc215)
-- Fixed unused parameter warning by \@maniacbug in [`14dcc34`](https://github.com/nRF24/RF24/commit/14dcc343dc457fa4b6752969f5b7505acab0b907)
-- Fixed bug of not including name. Also added extra tab on short strings. by \@maniacbug in [`91df6f6`](https://github.com/nRF24/RF24/commit/91df6f6df5d6d9b2b181e486b1a6141ed48e5033)
-- Fix bug in setDataRate by \@maniacbug in [`8701d82`](https://github.com/nRF24/RF24/commit/8701d82615a4e4c138b4b6dcc0dbe9d50efc04a5)
-- Fixed missing includes, thanks to Spoiler for reporting the problem. by \@maniacbug in [`a783ed3`](https://github.com/nRF24/RF24/commit/a783ed38da19d781a3863215d47a2e59a0b2754e)
-- Fixed bug in setcrclength and setdatarate which was mishandling the bits by \@maniacbug in [`1517f12`](https://github.com/nRF24/RF24/commit/1517f1249de1713d0ec26c37476cbf2bf4291b58)
-- Fix up some doc bugs by \@maniacbug in [`fcc3dfb`](https://github.com/nRF24/RF24/commit/fcc3dfbedb2e7047cd1f7f5931bea553c2ef1980)
-- Fix bugs. Ack payload available was broken since interrupts went in. stREtries was missing since the gcopeland merge. by \@maniacbug in [`df32840`](https://github.com/nRF24/RF24/commit/df328408f79962adaed44194fef99e4c7426f41c)
-- Fix bug in which static payloads were broken by \@maniacbug in [`af00a61`](https://github.com/nRF24/RF24/commit/af00a6155596b7728884a2759d11a02b9e54901e)
-- Fixed a bug when pipe 0 was NOT being used for writing. by \@maniacbug in [`cc7e0a2`](https://github.com/nRF24/RF24/commit/cc7e0a2f19264852847edd42c4231584da8ec104)
-- Fixed bug in scanner display, thanks to David Bath. Also upgraded to latest Jam toolchain and moved pins over to the new GettingStarted defaults. by \@maniacbug in [`5726c16`](https://github.com/nRF24/RF24/commit/5726c1622a1dc4d12d9a71d90e3dce167dba5e27)
-- Fix bug in pingpair Jamfile by \@maniacbug in [`76f79e6`](https://github.com/nRF24/RF24/commit/76f79e62ed1fa28887019aca9505196926bc9a3e)
-- Fix Jamfile for proper ordering of libraries by \@maniacbug in [`33e59af`](https://github.com/nRF24/RF24/commit/33e59af725074afd19e0e70f08c0711779f38b4c)
-- Fix bug introduced in the move to PROGMEM. Props to \@basilrx for finding this. Also added a test case to demonstrate the bug, and guard against more like it in the future. by \@maniacbug in [`2c97186`](https://github.com/nRF24/RF24/commit/2c9718632983e4ca563f559558cdede2358ccb35)
-- Standby after regular write cmd by \@TMRh20 in [`bcd48f2`](https://github.com/nRF24/RF24/commit/bcd48f2f471e0c9536b30b0be7ead0f62f163f5a)
-- Fixed link by \@TMRh20 in [`4d8da2f`](https://github.com/nRF24/RF24/commit/4d8da2f01de1d5e4ed2354d28f46c0ffec2a49d7)
-- TxStandBy hang. Updated Transfer example by \@TMRh20 in [`f3b3fb1`](https://github.com/nRF24/RF24/commit/f3b3fb1f444f0e0c6d32d4731860d966d8779272)
-- Missing byte with due RX by \@TMRh20 in [`d28323a`](https://github.com/nRF24/RF24/commit/d28323aadca8fa626315a9748c370d7e5a05dc64)
-- Due write() issues. by \@TMRh20 in [`afdb084`](https://github.com/nRF24/RF24/commit/afdb084daf9fce9c8792281c7fd17683ce2ce1e2)
-- Return value of write, writefast by \@TMRh20 in [`5fabf26`](https://github.com/nRF24/RF24/commit/5fabf2608a64572876e5b7b94a0e7e66b392cd8c)
-- Fix typo in readme by \@TMRh20 in [`cd8bb19`](https://github.com/nRF24/RF24/commit/cd8bb19dc3aa63d30b4e474ce95b8224f0fa71c2)
-- Fix for https://github.com/TMRh20/RF24/issues/8 by \@TMRh20 in [`57521fb`](https://github.com/nRF24/RF24/commit/57521fbcc43e0a13cd40c2eff897cf5394441348)
-- Fix for \#12 by \@TMRh20 in [`ecda0fa`](https://github.com/nRF24/RF24/commit/ecda0fad53ba897089efb46c045505b2f0fa749c)
-- Static payload size bug prev introduced by \@TMRh20 in [`e8a63c0`](https://github.com/nRF24/RF24/commit/e8a63c03712ae99b671718c6dfee62e7afd5c106)
-- RPi dynamic ACK issue by \@TMRh20 in [`9e12c23`](https://github.com/nRF24/RF24/commit/9e12c23683b57a5979572d9bf8e8386f14d7f928)
-- Multicast pipe0 address handling issue by \@TMRh20 in [`9da3eac`](https://github.com/nRF24/RF24/commit/9da3eac0941563d9e9828c8377c9a88a161cd855)
-- Fix display of pin info for ATTiny by \@TMRh20 in [`23532cf`](https://github.com/nRF24/RF24/commit/23532cfe4a8b728f77d4e3eca624868a2b757dcb)
-- Fix "warning: binary constants are a GCC extension". by \@reixd in [`6f70a3c`](https://github.com/nRF24/RF24/commit/6f70a3cc5a74dab00d834a31a3ad3b820056e8be)
-- Fix mistake in new code by \@TMRh20 in [`d3e5c4e`](https://github.com/nRF24/RF24/commit/d3e5c4e54d74e675d617a010ae0c741e80d6a614)
-- Fix wrong pin layout by \@reixd in [`51a71bc`](https://github.com/nRF24/RF24/commit/51a71bca0b1c1d9a025e58978bfc72981f3661f8)
-- Fix broken ATTiny support in updates branch by \@TMRh20 in [`3e6ca45`](https://github.com/nRF24/RF24/commit/3e6ca45f9ebab5729862d93989f1b378c55f99f7)
-- Broke SPI for Due and Teensy last commit by \@TMRh20 in [`c077f70`](https://github.com/nRF24/RF24/commit/c077f709de98fb174e98fa49b8db689981bc7377)
-- Fix for last commit (code merge) by \@TMRh20 in [`8503804`](https://github.com/nRF24/RF24/commit/85038040a56ed242b726a029493ebba4ee8df433)
-- Fix include for RF24_config.h by \@TMRh20 in [`bb88f4a`](https://github.com/nRF24/RF24/commit/bb88f4a78e702e83b3644e2fe01238281047bcd1)
-- Fix header file install for RPi in Makefile by \@TMRh20 in [`603f4cc`](https://github.com/nRF24/RF24/commit/603f4cc81489dfb0f23a3ac3109e8309b6da133d)
-- Fix for last pull request by \@TMRh20 in [`bfd62ea`](https://github.com/nRF24/RF24/commit/bfd62ead172060ac707ef3988d374e442ff77e30)
-- RPi memory corruption by \@TMRh20 in [`73cf59c`](https://github.com/nRF24/RF24/commit/73cf59c10af95bd99b843c920cb4aae40a2b02b8)
-- Fix mistake in example update by \@TMRh20 in [`a802136`](https://github.com/nRF24/RF24/commit/a802136a0487f7c5450c4d99b2caae93e67add9e)
-- Fix build for python wrapper by \@TMRh20 in [`6354cac`](https://github.com/nRF24/RF24/commit/6354cacc6f5456a536ae1002c3bb033b5ed85d2b)
-- Dual SPI devices with RF24 by \@TMRh20 in [`9b48595`](https://github.com/nRF24/RF24/commit/9b48595943a77ee78dba4b6e8d0d9c19c2144c94)
-- Fixed issue with ARDUINO not issuing CS for radio by \@prophet-roshak in [`c0848cb`](https://github.com/nRF24/RF24/commit/c0848cb1fad0c3ab45bb31813e2a8ffb17d97d47)
-- Fix isAckPayloadAvailable() per \@jorihardman by \@TMRh20 in [`f57b383`](https://github.com/nRF24/RF24/commit/f57b383039c7085888eb026a8944443c3a842444)
-- Fix operator precedence for isAckPayloadAvailable. by \@jorihardman in [`8bd5289`](https://github.com/nRF24/RF24/commit/8bd5289514f609c9a29353077217f2a251465576)
-- Fix IDE version detection for SPI transactions by \@TMRh20 in [`f6e1f37`](https://github.com/nRF24/RF24/commit/f6e1f37b3b46ba7ae92c617106ce6b9f0796724e)
-- Fix issue \#101 found by \@mz-fuzzy by \@TMRh20 in [`f691c45`](https://github.com/nRF24/RF24/commit/f691c45a69064c132dd11c52973e6fe011bded3a)
-- Fix the rest of issue \#101 per mz-fuzzy by \@TMRh20 in [`90d85be`](https://github.com/nRF24/RF24/commit/90d85bef4bf370f54404e00805431f77a49607e7)
-- Fix for SPI transaction code by \@TMRh20 in [`c79ccc7`](https://github.com/nRF24/RF24/commit/c79ccc70bb744f91b9d325d5b21b028fead3bd48)
-- Fix example per \#114 by \@TMRh20 in [`357fcb9`](https://github.com/nRF24/RF24/commit/357fcb95a5bc89704846679fa667dbcafe68a5ea)
-- Fix the last fix by \@TMRh20 in [`869a2c2`](https://github.com/nRF24/RF24/commit/869a2c2f7329967bc600e66d0b0422e959e22e2d)
-
-### <!-- 7 -->🚦 Tests
-
-- Prepare tests to run with configuration parameters by \@maniacbug in [`7640852`](https://github.com/nRF24/RF24/commit/7640852edf6e3cf139608fe70505cffa93a8c650)
-- Treat warning as errors in tests by \@maniacbug in [`18ebe7a`](https://github.com/nRF24/RF24/commit/18ebe7a0aac86bf90aa08e0fd8d48d6929651383)
-- Runtests now hups between each test instead of uploading by \@maniacbug in [`94635e8`](https://github.com/nRF24/RF24/commit/94635e8cc50843db3603971d9c8978f1942a2d5e)
-- Tune timing and upload rate of tests by \@maniacbug in [`205d4b5`](https://github.com/nRF24/RF24/commit/205d4b5cc12d119149e75e62e62b98fce0f38ac7)
-- Lib now passes all tests by \@TMRh20 in [`4340d93`](https://github.com/nRF24/RF24/commit/4340d9339a333c28c416406ada828cd3a465018e)
-- Update examples, minimize code size by \@TMRh20 in [`e83a107`](https://github.com/nRF24/RF24/commit/e83a107bdf8e7430457975b1d9251cc5c6ba7107)
-- Performance tweaks to address \#9 by \@TMRh20 in [`5ec5b06`](https://github.com/nRF24/RF24/commit/5ec5b06bdc4f3b58eac3f34b3c4355a51b659ae6)
-
-### <!-- 8 --> 📝 Documentation
-
-- Updated documentation by \@maniacbug in [`0503017`](https://github.com/nRF24/RF24/commit/0503017d1a03dd5163d32db2b399e33fdfdf4caa)
-- Simplified example to use less calls. in [`e97e023`](https://github.com/nRF24/RF24/commit/e97e0239d7861c27b08bb7541a1966b9c89a2120)
-- Tweaked doc paramters by \@maniacbug in [`117678c`](https://github.com/nRF24/RF24/commit/117678c46f0d0cf82377953a399bb9f6740fb705)
-- Cleaned up documentation. by \@maniacbug in [`21057e4`](https://github.com/nRF24/RF24/commit/21057e4608e755ef606e33041df3f18290572638)
-- Revised documentation by \@maniacbug in [`1c65c7f`](https://github.com/nRF24/RF24/commit/1c65c7f181f8e6040e3f37d4302574eb5ebea147)
-- Updating docs by \@maniacbug in [`f3369a5`](https://github.com/nRF24/RF24/commit/f3369a552cd49d8e57cbc1e11a48a985082026ef)
-- Docupdate by \@maniacbug in [`1c6cc96`](https://github.com/nRF24/RF24/commit/1c6cc96fb74a406786bab4f9841d82f65a65c861)
-- More doc tweaks by \@maniacbug in [`c9d64fd`](https://github.com/nRF24/RF24/commit/c9d64fd0888d7f7610c8bded105a787086fda62e)
-- Update docs for 1.0 by \@maniacbug in [`8ea84e7`](https://github.com/nRF24/RF24/commit/8ea84e7f77fc4122d77b1bd035d78d18eaab0bda)
-- Update docs and comments for new nordic fob blog post by \@maniacbug in [`e31f8c8`](https://github.com/nRF24/RF24/commit/e31f8c8211c82a8984bc7a1e2dfa098d99108a71)
-- Update readme temporarily by \@TMRh20 in [`dfc75db`](https://github.com/nRF24/RF24/commit/dfc75db8e61276e9920e1cbc6be59939966ca4d9)
-- Updated readme and h file for doxygen by \@TMRh20 in [`14187cd`](https://github.com/nRF24/RF24/commit/14187cd1a1257ee889fc41b5986ce75324f5500d)
-- Corrected part of the documentation by \@TMRh20 in [`63ee0ce`](https://github.com/nRF24/RF24/commit/63ee0ce2c077373e4d25cc4ef30fac1036df6854)
-- Update doxyfile & css to match tmrh20.github.io by \@TMRh20 in [`04165e4`](https://github.com/nRF24/RF24/commit/04165e4dd1ce9aa5b46b4b0f7b2705a6c74e53b2)
-- Update RF24.h with documentation info by \@TMRh20 in [`9ddbe8b`](https://github.com/nRF24/RF24/commit/9ddbe8b168c93c09e8b7d7eb42e3a3e4903bbd9b)
-- Documentation and File Structure Changes by \@TMRh20 in [`8a0f5ab`](https://github.com/nRF24/RF24/commit/8a0f5ab57a778c468a90b3e6ed6164fe5daf6e54)
-- Replace readme with link to tmrh20.github.io/RF24 by \@TMRh20 in [`5333b4e`](https://github.com/nRF24/RF24/commit/5333b4efa8cfe43ce1e4ad80e645865e6c624785)
-- Reorganize Optional and Advanced parameters in docs by \@TMRh20 in [`7741224`](https://github.com/nRF24/RF24/commit/7741224e9678db941068d498c44a7bc0750b4c90)
-- More doc updates for coming changes by \@TMRh20 in [`8e15310`](https://github.com/nRF24/RF24/commit/8e1531014fe34b13aab168bf9b03106ef2ddfbc5)
-- Update docs in 'updates' branch by \@TMRh20 in [`b320f9e`](https://github.com/nRF24/RF24/commit/b320f9e69c130ebe5b75ef15bb6b350fe71a68ea)
-- Update *.cpp examples pin config by \@TMRh20 in [`b342d97`](https://github.com/nRF24/RF24/commit/b342d97f3693f89f06739ccf351281a95ac21805)
-- \@PlatformIO Library Registry manifest file by \@ivankravets in [`ea960e0`](https://github.com/nRF24/RF24/commit/ea960e057b3360094a153ca1ab9c6fa984c3d68a)
-
-### <!-- 9 --> 🗨️ Changed
-
-- Type by \@maniacbug in [`ea69f9d`](https://github.com/nRF24/RF24/commit/ea69f9d1a6e085ce4df7ff125ca3af30ea94e2b3)
-- Changed name of print_details to comply with the overall naming convention by \@maniacbug in [`0dc43ab`](https://github.com/nRF24/RF24/commit/0dc43ab8722c74c8efd9a960014219805407ebcf)
-- Tuned the text a bit by \@maniacbug in [`c5c4537`](https://github.com/nRF24/RF24/commit/c5c4537cdc94a2d50b4fec5bd61aa15b738da04e)
-- Flipped the logic on the role pin. by \@maniacbug in [`c2dc356`](https://github.com/nRF24/RF24/commit/c2dc35652e500e58aa11b44e6f1344c5e8868a26)
-- Make the makefile be smart about which OS it's running, and make by \@maniacbug in [`e1db440`](https://github.com/nRF24/RF24/commit/e1db4401ca01fd5a113e49acdbe8b0148c45c0e7)
-- Trying to get the formatting just right by \@maniacbug in [`0668494`](https://github.com/nRF24/RF24/commit/0668494aee5536d43fb23806d9f0c9bdfb113dee)
-- Now sets spi data mode before interacting with the chip. needed to interoperate with other spi devices by \@maniacbug in [`1045cec`](https://github.com/nRF24/RF24/commit/1045cec9b13d079102c92488854c74b1aa0d66c9)
-- Updated vim modeline by \@maniacbug in [`5b632f3`](https://github.com/nRF24/RF24/commit/5b632f374085b17d8614fb3c13fb3d79bae9a9ff)
-- Enabled warnings, and cleaned up warnings. Updated pingpair makefile for recent makefile improvements by \@maniacbug in [`e188242`](https://github.com/nRF24/RF24/commit/e188242a8687c2880dbb60b394308a6dd25c254e)
-- Merge branch 'master' of github.com:maniacbug/RF24 by \@maniacbug in [`e005ec7`](https://github.com/nRF24/RF24/commit/e005ec75f140db665c889727c55d2c234f28e940)
-- Moved printf format strings to progmem. by \@maniacbug in [`33b8973`](https://github.com/nRF24/RF24/commit/33b897318fd04f33c91fc5adf0aa67cb2461938e)
-- Split out upload target into two by \@maniacbug in [`e7254a3`](https://github.com/nRF24/RF24/commit/e7254a3b3a0f85b5c168057cdf4336681dbe92bb)
-- Merge branch 'master' of 207.97.227.239:maniacbug/RF24 by \@maniacbug in [`a88e78a`](https://github.com/nRF24/RF24/commit/a88e78a0da96fe2335c6249b1c5dfa7216f75c3c)
-- Stripped down extraneous pipe opens, and other un-needed things. by \@maniacbug in [`39b15c8`](https://github.com/nRF24/RF24/commit/39b15c8b55f8e86ac0295cf430123818eb9db349)
-- Got ack payloads working. Renamed from 'ackpacket' by \@maniacbug in [`ffc7d09`](https://github.com/nRF24/RF24/commit/ffc7d099ed05e48724b6471b4d75ce98d8a05075)
-- Cleaned up comments, variables names, enums by \@maniacbug in [`f3356f3`](https://github.com/nRF24/RF24/commit/f3356f31a281dc5895b16c7842440a32979738bf)
-- Created a new example to show sleeping in between sends. This isn't done yet. It's just a copy of pingpair for now. by \@maniacbug in [`72dc774`](https://github.com/nRF24/RF24/commit/72dc77467e0d42a0e0ccc2c5d20e2506074330e0)
-- First complete compile/link with sleep functionality. Haven't run it yet. by \@maniacbug in [`3179382`](https://github.com/nRF24/RF24/commit/31793823eaefee67246638621e6cdc126e3bea5b)
-- Turned off serial debug by \@maniacbug in [`0d20f83`](https://github.com/nRF24/RF24/commit/0d20f831d02958f78f1c759288adc71de4a6ae0f)
-- Created new example, copied from starping by \@maniacbug in [`1fd8ee7`](https://github.com/nRF24/RF24/commit/1fd8ee72c0b9a32d754ece211b1790bea0265b4e)
-- Rewired everything, re-tested with ping/pong nodes only by \@maniacbug in [`9868642`](https://github.com/nRF24/RF24/commit/986864236c51b70692e6ca143ddcf6a6a3bba79d)
-- Allow opening pipe 0 for reading. Useful if it's on a different subnet from others by \@maniacbug in [`d8b2512`](https://github.com/nRF24/RF24/commit/d8b2512e0c391ef218e941a52dd554d0f288a199)
-- Moved base node code, to make it more readable by \@maniacbug in [`33edb1f`](https://github.com/nRF24/RF24/commit/33edb1f18acee3f45db56ce7785e70febccc6c57)
-- Leaf only starts hunting for a new slot after 3 timeouts. Makes the system more stable. by \@maniacbug in [`e86c6b0`](https://github.com/nRF24/RF24/commit/e86c6b0f15f7171adf57f6aaacdef72cf15a07c0)
-- Now caches the reading pipe 0 and re-sets it when starting to listen. by \@maniacbug in [`1d28d28`](https://github.com/nRF24/RF24/commit/1d28d28a29d452d79b42dd94732e550721b727be)
-- Refactored common code from leaf/relay nodes into static functions. Improved comments. by \@maniacbug in [`7e65824`](https://github.com/nRF24/RF24/commit/7e658242e2e22c313ecbb06c55a49be93f50a507)
-- Comment bug by \@maniacbug in [`77a4c95`](https://github.com/nRF24/RF24/commit/77a4c953193c8c18cce7fcd09ff53e12c46d5c41)
-- Renamed ping delay to ping interval and added some comments by \@maniacbug in [`937805d`](https://github.com/nRF24/RF24/commit/937805d6a2acde22bf685e5fdbc0905c937004f1)
-- Do clock divider on chip select. Should improve SPI interop with other devices by \@maniacbug in [`8f80038`](https://github.com/nRF24/RF24/commit/8f8003822760e76bf1e43cd6000031e804de1168)
-- Avoid spurious warnings by \@maniacbug in [`40eea86`](https://github.com/nRF24/RF24/commit/40eea86ffe6993eecb3ef97652009821f5b316a7)
-- Environment-specific changes for me. Testing out latest arduino from git, and added a 3rd upload option by \@maniacbug in [`1062f9d`](https://github.com/nRF24/RF24/commit/1062f9d879c6c6a1ca77c315b7a9bc39a31cd9bd)
-- Made all CONFIG register changes incremental not absolute by \@maniacbug in [`ec33f03`](https://github.com/nRF24/RF24/commit/ec33f0336880ac530623f4e94ba32234140e94b0)
-- Astyle -A1 by \@maniacbug in [`26c45e8`](https://github.com/nRF24/RF24/commit/26c45e85a9dab5586d56fa649657c3a383bc9753)
-- Changed the logic. Button press now toggles the LED. by \@maniacbug in [`3cc856a`](https://github.com/nRF24/RF24/commit/3cc856aa952840e67f1d09290bde0635d570195a)
-- Cleaned up some reinterpret casts to use new-style casts by \@maniacbug in [`aa7a7c6`](https://github.com/nRF24/RF24/commit/aa7a7c647ae5700d7a3e47f2fe713fd87e6f477b)
-- Refactor repeated parts of printDetails into own methods by \@maniacbug in [`92373ba`](https://github.com/nRF24/RF24/commit/92373ba7f53f451f2e60bb557817982caa782463)
-- Move examples to 57600 baud by \@maniacbug in [`fea8c0e`](https://github.com/nRF24/RF24/commit/fea8c0e82f831d0442c38e84b4ae2fea1614deae)
-- Moved completely over to jam. bye bye make\! by \@maniacbug in [`e7c30f2`](https://github.com/nRF24/RF24/commit/e7c30f265fca9933710c99ef636a1faa948d6ba5)
-- Deleted starping relay. Superseded by RF24Network. by \@maniacbug in [`549d405`](https://github.com/nRF24/RF24/commit/549d4054fba01f1b3d63ea1761aa136ad86b218b)
-- Purge useless gitignores by \@maniacbug in [`86798b6`](https://github.com/nRF24/RF24/commit/86798b65e4407764f2d69eac7168ca5331d9c7af)
-- Prettied up printDetails some more by \@maniacbug in [`81f85bd`](https://github.com/nRF24/RF24/commit/81f85bd5215704269e11a31619d41ba20c58420c)
-- Tidied up EN_RXADDR setting by \@maniacbug in [`c151ffb`](https://github.com/nRF24/RF24/commit/c151ffbf67c5b64baef1852ea9e7ec83ba7dc70f)
-- Documented some questionable behaviour as pointed out by mdenzien by \@maniacbug in [`ca4820c`](https://github.com/nRF24/RF24/commit/ca4820cd27fb5466b73c96dfaf23d6c6d0899a65)
-- Made timeouts more explicit in write() by \@maniacbug in [`c5823c2`](https://github.com/nRF24/RF24/commit/c5823c2605e80ffd73e31d6a5b6a76249be13228)
-- More comments, factored out powerdown from write() by \@maniacbug in [`c62224f`](https://github.com/nRF24/RF24/commit/c62224ff8636f259dcbab79d544f3ea8b444ae0c)
-- Factored out status-checking from write() into a public method by \@maniacbug in [`fbae441`](https://github.com/nRF24/RF24/commit/fbae441249f11a3f15b856881c71899182b42ca3)
-- Initial checking of new pingpair_irq example. Right now this is just the pingpair example but renamed. by \@maniacbug in [`bb37e88`](https://github.com/nRF24/RF24/commit/bb37e88094c6ed4193b1de45d56d6fece84518d3)
-- Created a non-blocking write and an example for how to use it. by \@maniacbug in [`d3fff68`](https://github.com/nRF24/RF24/commit/d3fff68a7cd3aaddc75ec989b50ab79a2704fe5c)
-- Simplified printing, ok to do just from the irq handler by \@maniacbug in [`8549566`](https://github.com/nRF24/RF24/commit/854956687f85bdb98ec2f50092bde885066eed81)
-- Now both roles use the IRQ. Thanks to Mike Denzien for testing & troubleshooting. by \@maniacbug in [`062d833`](https://github.com/nRF24/RF24/commit/062d83346b27c03bcc4789c6b94f12ee3ed6be9b)
-- Astyle -A1 -s2 by \@maniacbug in [`d5a3e79`](https://github.com/nRF24/RF24/commit/d5a3e79c665f29bca7940b2889773f0165accc55)
-- Optimization of whatHappened, suggested by Mike Denzien by \@maniacbug in [`b000a87`](https://github.com/nRF24/RF24/commit/b000a87aa1f9582a887569591fbd8edbfacf1f8f)
-- Implement dynamic payloads, with an example by \@maniacbug in [`63eb62e`](https://github.com/nRF24/RF24/commit/63eb62ebc3a69f4f549532c493ce48cdfa0a8928)
-- Clean up read() to use new-style read_register, which reduces it to two lines of code by \@maniacbug in [`9566c82`](https://github.com/nRF24/RF24/commit/9566c82367a735b1db7b603880dc657352a1793a)
-- Reduce example payload size. Does this help reliability? by \@maniacbug in [`774f53d`](https://github.com/nRF24/RF24/commit/774f53d6c5ff7cc635b2a5740b8044c3d9132b68)
-- Comments by \@maniacbug in [`ccf3289`](https://github.com/nRF24/RF24/commit/ccf32891f02f07564e7a4114cd5468572cd76103)
-- Purge 'boolean' type, use 'bool' instead by \@maniacbug in [`42bf3e8`](https://github.com/nRF24/RF24/commit/42bf3e8cd2acb68ca346779b4479495563929568)
-- Created skeleton of new test by \@maniacbug in [`0946538`](https://github.com/nRF24/RF24/commit/0946538f3a4df9000005ed470a1a53983bae8a4a)
-- Bugfix by \@maniacbug in [`c624815`](https://github.com/nRF24/RF24/commit/c6248157046fca8ee8a358d71eba3eb6c8a98664)
-- Created an all-up script runner by \@maniacbug in [`af37c34`](https://github.com/nRF24/RF24/commit/af37c345e87e7bbf67196bc667ee1156a0ae3af1)
-- Simplify specification of test configs slightly by \@maniacbug in [`c408c5e`](https://github.com/nRF24/RF24/commit/c408c5ef90928c679e4533183dbe6f19008d39e1)
-- New P variant feature support with corresponding defines. RF_DR is now broken into two bits to support P variant and is now obsolete. RF_DR is now RF_DR_HIGH and RF_DR_LOW; with RF_DR_HIGH corresponding to the original RF_DR bit. Data rate can now select 250kbs mode on supporting hardware. by \@gcopeland in [`1a37c1c`](https://github.com/nRF24/RF24/commit/1a37c1cd0ff12675ea983f921b445771b0e699da)
-- Moved the wide_band variable and initializer cleanup. by \@gcopeland in [`634d0ef`](https://github.com/nRF24/RF24/commit/634d0efde5930e79d1bc2a51972f83e942394d62)
-- Re-organized nRF24L01.h file to place 'P' features in one by \@gcopeland in [`059efa5`](https://github.com/nRF24/RF24/commit/059efa5ffa03d544c80d0101c6c6de14a1e5f582)
-- Reverted constructor changes. Changed SPI bus speed. Fixed setAutoAck by \@gcopeland in [`b491480`](https://github.com/nRF24/RF24/commit/b491480dde5669590996f8b9db510d03ea57f3d6)
-- As a just in case I misunderstood some of the constant-ness changes, I by \@gcopeland in [`0c2515d`](https://github.com/nRF24/RF24/commit/0c2515df19d180c82303bcda074f06a239f6ff2c)
-- Sed s/boolean/bool/g by \@maniacbug in [`956b63a`](https://github.com/nRF24/RF24/commit/956b63a4dce35afb73bdd4847f20512fbbb38ea5)
-- Merge cleanups by \@maniacbug in [`cd3b0b3`](https://github.com/nRF24/RF24/commit/cd3b0b3ccbb55c09d9b4b7beb8ca001b86cf6f41)
-- Changed test to use new 250kbps mode by \@maniacbug in [`77a798b`](https://github.com/nRF24/RF24/commit/77a798b1a91d213b0fb65734afc5a89cda24ce70)
-- Improve pingpair timing. Should lead to less timeouts. by \@maniacbug in [`7b401d7`](https://github.com/nRF24/RF24/commit/7b401d7281d783b4a156ad4b9c4a41a18aec9fd0)
-- Experimental changes to help in debugging by \@maniacbug in [`2f33bdb`](https://github.com/nRF24/RF24/commit/2f33bdbebd697919e936fcf825dd62e66afebdda)
-- Merge fix for static payloads by \@maniacbug in [`4542464`](https://github.com/nRF24/RF24/commit/4542464e0b88946d74ac44cf3c9dfcaf48b82cee)
-- Static and dynamic payloads now fully fixed and interoperable by \@maniacbug in [`a31cafc`](https://github.com/nRF24/RF24/commit/a31cafcc887f1809fb63ac23ea3881e1bcda3e17)
-- Ignore .swp files by \@maniacbug in [`39ca6b9`](https://github.com/nRF24/RF24/commit/39ca6b95dd127340869445d3e746c8f01c7c623b)
-- Merge master with static payload fixes by \@maniacbug in [`3aab74a`](https://github.com/nRF24/RF24/commit/3aab74ae8f0338c27dba97749a3386987e6460b6)
-- Comment cleanups by \@maniacbug in [`a261710`](https://github.com/nRF24/RF24/commit/a261710761b885915c5b8c27af453bf3fef5bb57)
-- Test refinement. IRQ test times out after not receiving anything, warning that you probably don't have interrupts hooked up. by \@maniacbug in [`d967f77`](https://github.com/nRF24/RF24/commit/d967f7708f0cb2a560f17cb96a60e53608ea565b)
-- Reorganize header file to better group the now very large list of methods by \@maniacbug in [`4833610`](https://github.com/nRF24/RF24/commit/483361029e812f22d8fd66e431d4720fe04a5928)
-- CHanged default data rate to 1MBps and default channel to 100 for better performance by \@maniacbug in [`5344c5f`](https://github.com/nRF24/RF24/commit/5344c5fe8cefaafa1a267267e7edefec631603d9)
-- Small tweaks and new test for native target by \@maniacbug in [`e1527af`](https://github.com/nRF24/RF24/commit/e1527afc31bb46fff3929df579aec5e81eb9d078)
-- Avert warnings on native platform by \@maniacbug in [`19dd5c7`](https://github.com/nRF24/RF24/commit/19dd5c77265bd61d6c84df8bd9c4278f7c449c5e)
-- More debugging information. by \@gcopeland in [`7ad1b40`](https://github.com/nRF24/RF24/commit/7ad1b409fe180b7c37aeecefb08bc4f93c503e5d)
-- Yet more merge cleanup. Changes default channel to be by \@gcopeland in [`a4cabc6`](https://github.com/nRF24/RF24/commit/a4cabc66a2b15c45182718c9302385d7378b4447)
-- Flush all buffers on start and stop listening by \@maniacbug in [`066d79f`](https://github.com/nRF24/RF24/commit/066d79f21e5570251f4b7e56e14a3248200c0f05)
-- Using Arduino 21 by \@maniacbug in [`f5c0ba2`](https://github.com/nRF24/RF24/commit/f5c0ba25ee04dd4689f90261d533e5040ed888ce)
-- Compatibility with Arduino 1.0 by \@maniacbug in [`d92ac14`](https://github.com/nRF24/RF24/commit/d92ac14f8685f01a3ea2a1d94083b0ca99851f60)
-- Move default pins over to Getting Started defaults by \@maniacbug in [`9f806a5`](https://github.com/nRF24/RF24/commit/9f806a5b00ee2809a530b2695661431970267db9)
-- Changes to work on Maple by \@maniacbug in [`f393408`](https://github.com/nRF24/RF24/commit/f3934084a1368a2e1683ce9b7739a4099edf8c69)
-- Moved environment-specific checking out to RF24_config.h by \@maniacbug in [`53cb579`](https://github.com/nRF24/RF24/commit/53cb579400a76db6583ee973332c6c6d17a7f7d5)
-- Clean up pin assignments by \@maniacbug in [`840ad1c`](https://github.com/nRF24/RF24/commit/840ad1cd3dc5ce1d23c0d070ef14343cd4ddaf40)
-- Handle SPI.h better in Maple by \@maniacbug in [`5cb32c9`](https://github.com/nRF24/RF24/commit/5cb32c92cc709c2fc86508864fbdb014f5ab80c5)
-- Reduce delays in startWrite down to only required delays by \@maniacbug in [`50b18a9`](https://github.com/nRF24/RF24/commit/50b18a9c7dc39bd27db7405567b7d27f338100ff)
-- Correct the comment for pin #'s by \@maniacbug in [`8493b9a`](https://github.com/nRF24/RF24/commit/8493b9a60e694d9824bf3a91c30c5d9e9e2094f8)
-- Documentation update. 1.0 fully supported, Maple works, more examples, links and pictures for proejcts by \@maniacbug in [`fc06760`](https://github.com/nRF24/RF24/commit/fc067607364c02b38474bb7a2f2ae778cd86fb1a)
-- Use latest copyright by \@maniacbug in [`07a4bcf`](https://github.com/nRF24/RF24/commit/07a4bcf425d91c99105dbdbad0226296c7cd3a93)
-- New 'nordic_fob' example started, based on pingpair by \@maniacbug in [`36167a9`](https://github.com/nRF24/RF24/commit/36167a9e02fecc3d45f863083b43a619953cb98e)
-- Nordic_fob example fully working. by \@maniacbug in [`d1653e8`](https://github.com/nRF24/RF24/commit/d1653e8cad74daf6fa4fa60a5646804592ee8290)
-- Really...Pins 9 & 10 this time. I mean it\! by \@maniacbug in [`cb6613d`](https://github.com/nRF24/RF24/commit/cb6613d62fdc7f68327811d5cb2e36821b55c695)
-- Reduce RAM footprint by moving static const data to progmem, and refactoring out switch statements. by \@maniacbug in [`eb3b2d8`](https://github.com/nRF24/RF24/commit/eb3b2d800a240ce097e45423816dc0db9b423ef2)
-- Use latest Jamfile by \@maniacbug in [`c2e9564`](https://github.com/nRF24/RF24/commit/c2e956467895ffe73d705afd1b84c5c68bf65775)
-- Pingpair_blocking test now uses expect and runs on linux by \@maniacbug in [`dec61af`](https://github.com/nRF24/RF24/commit/dec61af85fa5316ade24168006797c547dc8bbc4)
-- FAQ- How much RAM?? by \@maniacbug in [`c6262ed`](https://github.com/nRF24/RF24/commit/c6262edbce48bb839d5fed4412da0fad39e0250a)
-- Latest jamfiles by \@maniacbug in [`84e464d`](https://github.com/nRF24/RF24/commit/84e464def4a52a3a697ee95d26eb66997db0ea76)
-- Update examples/led_remote/led_remote.pde in [`49f22ea`](https://github.com/nRF24/RF24/commit/49f22eae21c2b7a872897a6a627bd255369ff2b2)
-- Merge pull request \#16 from RWSDev/master by \@maniacbug in [`8eaad77`](https://github.com/nRF24/RF24/commit/8eaad77b2cb6d7491d5bc757d1bdfb78e6bebad1)
-- Changed writing modes by \@TMRh20 in [`d0ec0c4`](https://github.com/nRF24/RF24/commit/d0ec0c461ce6c2e1f15b334344330cdf8f993417)
-- Inspired idea to change TX standby code by \@TMRh20 in [`1e2f41c`](https://github.com/nRF24/RF24/commit/1e2f41c3f8143c9be0ae4aaa165cf98cb3052d84)
-- Updated some examples to show the new lib usage by \@TMRh20 in [`99571d6`](https://github.com/nRF24/RF24/commit/99571d653001b143d8305425e2eab193136b38fe)
-- TxStandby() function modified completely by \@TMRh20 in [`1cc7454`](https://github.com/nRF24/RF24/commit/1cc7454d97d0995e443745c788e37e1f9192d62e)
-- Forgot to move startFastWrite to public by \@TMRh20 in [`0ddec52`](https://github.com/nRF24/RF24/commit/0ddec5256343186aafef9d4c653d12ace6a2e712)
-- Extended timeouts, txStandBy changes by \@TMRh20 in [`6263bcc`](https://github.com/nRF24/RF24/commit/6263bccd0241aaf0c0e45106d514ea34516f39e9)
-- Full Due support, maskIRQ function by \@TMRh20 in [`e1aaa57`](https://github.com/nRF24/RF24/commit/e1aaa571721d48584c43cfb287f55efc17ed97dd)
-- Revamped write_payload() and read_payload() by \@zephyrr in [`84146a1`](https://github.com/nRF24/RF24/commit/84146a17f301d4e341f12db9613bff44cc285ae0)
-- Merge pull request \#1 from zephyrr/master by \@TMRh20 in [`8077f56`](https://github.com/nRF24/RF24/commit/8077f56a7f1d9ca0e0bd078b1077215d89e52c3d)
-- ATTiny support fr jscrane fork tested and working by \@TMRh20 in [`07eb9f8`](https://github.com/nRF24/RF24/commit/07eb9f874999c2d862a99d452a29d08a0798760d)
-- EnableDynamicAck(), Single NOACK, default RT, by \@TMRh20 in [`92a19af`](https://github.com/nRF24/RF24/commit/92a19af8f808967aa03cf4e18d8e4c9fd3cc27fc)
-- Revert powerUp() delay to 5ms delay by \@TMRh20 in [`1858312`](https://github.com/nRF24/RF24/commit/185831233868b07310b69daefa63b169f1bf8ed4)
-- FIFO rd change (Thanks Zephyrr), Initial SI24R1 support by \@TMRh20 in [`c965f73`](https://github.com/nRF24/RF24/commit/c965f73838383f7d11d15670ddc371f98b5be8b3)
-- Small fix before pushing last commit by \@TMRh20 in [`8ff9fb6`](https://github.com/nRF24/RF24/commit/8ff9fb6f155d263adc5671e7b1c28f6265a73f15)
-- Raspberry Pi support by \@TMRh20 in [`2406e06`](https://github.com/nRF24/RF24/commit/2406e06a777d1ff0e2feb4c0b62b42f27ee21a59)
-- Restore closeReadingPipe by \@a-lurker in [`1289f85`](https://github.com/nRF24/RF24/commit/1289f85c4c25e1dbe4d85a7c2b7e09fba1063e75)
-- Merge pull request \#4 from a-lurker/master by \@TMRh20 in [`e682b7d`](https://github.com/nRF24/RF24/commit/e682b7dd0c9677b6e214353896fb68124f803575)
-- Install header files and separate install task by \@cornet in [`9895101`](https://github.com/nRF24/RF24/commit/9895101a43015bb1352f86977106567c1a5bacf2)
-- Bring readme.md inline with new Makefile by \@cornet in [`dc9ccbf`](https://github.com/nRF24/RF24/commit/dc9ccbff92b1229ff75fec3824595c461f03982d)
-- Cleanup readme syntax by \@cornet in [`8e8c111`](https://github.com/nRF24/RF24/commit/8e8c1115eb110a722d623e2490e9caecc0dc9ffd)
-- Cleanup table in readme by \@cornet in [`ddd6a0d`](https://github.com/nRF24/RF24/commit/ddd6a0dc1f1e3adda16f5691356e3062669d93bf)
-- Use spaces, not tabs, in readme.md by \@cornet in [`ac3962c`](https://github.com/nRF24/RF24/commit/ac3962cca58567886be310af33c6aaae564d3d27)
-- Make install should build first by \@cornet in [`c004c55`](https://github.com/nRF24/RF24/commit/c004c5545040d3df83cdce0a9aec1c5dc6278016)
-- Merge pull request \#2 from cornet/fix-rpi-build-scripts by \@TMRh20 in [`ee7f603`](https://github.com/nRF24/RF24/commit/ee7f6035cf6753864c14da739fa4c60ba7716ef1)
-- Update readme by \@TMRh20 in [`01cac5c`](https://github.com/nRF24/RF24/commit/01cac5c3bfa29c9b0d67efab971c16135d1cb8d8)
-- De-Activate features by default with RPi by \@TMRh20 in [`b7e4a09`](https://github.com/nRF24/RF24/commit/b7e4a09abee35c4284b3fa93abfb7617cd81eb42)
-- Updated address assignment by \@TMRh20 in [`b7c24a8`](https://github.com/nRF24/RF24/commit/b7c24a81792d1c28aa30de1854c503a747f41bb6)
-- Updated examples per issue \#6 by \@TMRh20 in [`a009487`](https://github.com/nRF24/RF24/commit/a009487abdbf2d3d00cd60f1f8e0a979d749b3bb)
-- Update rpi readme by \@TMRh20 in [`db1c051`](https://github.com/nRF24/RF24/commit/db1c0510798e8226373cbb303844ca336aed344d)
-- Initial Teensy3x support by \@TMRh20 in [`5e63e3a`](https://github.com/nRF24/RF24/commit/5e63e3aeba3403290bd6b5fad5cef6e03f1e8537)
-- Updated defines, fixed missing due define by \@TMRh20 in [`b8312b5`](https://github.com/nRF24/RF24/commit/b8312b5382c047d704565e157e10be5273c4c457)
-- Further tweaks per \#9 by \@TMRh20 in [`b62e179`](https://github.com/nRF24/RF24/commit/b62e179ab2866a05d14bd8e86db74fe652b5d917)
-- - Fixes and modifications for Due & Teensy3.x by \@TMRh20 in [`aac1650`](https://github.com/nRF24/RF24/commit/aac1650646b2c440c8822deb2f99514f4e2e4ddd)
-- Final tweaks to address \#9 by \@TMRh20 in [`b8d97f5`](https://github.com/nRF24/RF24/commit/b8d97f53c138a23f6a0d262d508f3f29b5b5b659)
-- RPi - Example updates, minor bmc driver change by \@TMRh20 in [`ea98781`](https://github.com/nRF24/RF24/commit/ea9878107267a4c7fa3cf3c2fed405c224e6b56a)
-- Adj delay to accomodate 250kbps rates better by \@TMRh20 in [`cb60afe`](https://github.com/nRF24/RF24/commit/cb60afe1dfb1d2cdc6ddf5bc73646b93207a50d4)
-- Delay for dyn_Pld_length corruption by \@TMRh20 in [`4e250cb`](https://github.com/nRF24/RF24/commit/4e250cbb07740dfa7e7358c4ab64c4eec44a4874)
-- Reduce error rate in call response scenarios by \@TMRh20 in [`9e28a60`](https://github.com/nRF24/RF24/commit/9e28a60236cca121eb3d746ea53b9d362f06b381)
-- Merge pull request \#19 from reixd/master by \@TMRh20 in [`f5341bf`](https://github.com/nRF24/RF24/commit/f5341bfc5010f0c87c285510e01f2a7f53bec4b2)
-- Select a standard pin layout for the examples. by \@reixd in [`e16c99e`](https://github.com/nRF24/RF24/commit/e16c99e1f0d1c3976a249f52221075cae97681e0)
-- Merge pull request \#21 from reixd/examples by \@TMRh20 in [`8c0e9f8`](https://github.com/nRF24/RF24/commit/8c0e9f80b70fbcd192728de4c0f9e89fee89e656)
-- RPi B+ Update to BCM2835 V1.37 by \@TMRh20 in [`a2c3977`](https://github.com/nRF24/RF24/commit/a2c3977ac1d60f901887a2dfa2ee5ba28672630f)
-- RPi B+ Update to BCM2835 V1.37 by \@TMRh20 in [`1732332`](https://github.com/nRF24/RF24/commit/173233231a12e502ed655544367fee7489772680)
-- Merge code per \#17 by \@TMRh20 in [`0153c71`](https://github.com/nRF24/RF24/commit/0153c713d991dc73d35684379f2fb8ef7eab56f2)
-- Merge remote-tracking branch 'origin/Updates' by \@TMRh20 in [`1c89b94`](https://github.com/nRF24/RF24/commit/1c89b946cf050b1f13829a7d7f4051926dc1e296)
-- Teensy Support by \@TMRh20 in [`5ff3088`](https://github.com/nRF24/RF24/commit/5ff3088ee39376ecb42192bb6366eba1e8aaf92a)
-- \#24 Enable UART as 2ndary SPI BUS by \@TMRh20 in [`3f4a1cb`](https://github.com/nRF24/RF24/commit/3f4a1cbcadf3bb2854810b1ef39e077102af94a5)
-- \#24 Add softSPI supp, fix SPI_UART by \@TMRh20 in [`56b7711`](https://github.com/nRF24/RF24/commit/56b7711ed09dac3264c96b2ed8a40a16eb599151)
-- \#25 Fix CRC status, revert to default SPI lib by \@TMRh20 in [`5238ca2`](https://github.com/nRF24/RF24/commit/5238ca2576562e20c8aca13302f8723b1f1364fe)
-- \#24 Fix: SoftSPI or UartSPI working with std SPI by \@TMRh20 in [`2d79e75`](https://github.com/nRF24/RF24/commit/2d79e75e3a468f9c2dfec4e475912c08d7502f83)
-- \#24 lol Fix: Spelling and ; on std spi define by \@TMRh20 in [`80e942c`](https://github.com/nRF24/RF24/commit/80e942ce6892e47727552241aa12f16522471690)
-- Merge branch 'Updates' of https://github.com/TMRh20/RF24 into Updates by \@TMRh20 in [`ecc5135`](https://github.com/nRF24/RF24/commit/ecc51358c839341328cb5102d4cabe044c00108c)
-- Merge remote-tracking branch 'origin/master' into Updates by \@TMRh20 in [`8be1be0`](https://github.com/nRF24/RF24/commit/8be1be0cfa3c88e5ec8e4eeb930946a4092a42ad)
-- Built-in support multiple radios on RPi by \@TMRh20 in [`d6a9c3d`](https://github.com/nRF24/RF24/commit/d6a9c3d3cf8309b95b441cb29b39f2541354f55f)
-- Character fix by \@lnxbil in [`422495a`](https://github.com/nRF24/RF24/commit/422495ade0b55a7bdd8d159c2735c727fb3ac0d5)
-- Merge pull request \#28 from lnxbil/printDetails-fix by \@TMRh20 in [`79eb410`](https://github.com/nRF24/RF24/commit/79eb4107a34578db20e90f58ba43cf9176a40cbc)
-- Merge RPi and Arduino code by \@TMRh20 in [`435e4db`](https://github.com/nRF24/RF24/commit/435e4db883811700d4688b9d5c86bf93528d31fa)
-- Replace old examples with the current ones for RPi by \@TMRh20 in [`c51049d`](https://github.com/nRF24/RF24/commit/c51049de7c3c3c65967d03f1e201c0b113db0b5d)
-- Moved RPi SPI driver to RPi folder from root by \@TMRh20 in [`eabd46a`](https://github.com/nRF24/RF24/commit/eabd46aec6d1313bba1e38ddfd5f3b7db60912d2)
-- Incr delay in stopListening(); Fix transfer example by \@TMRh20 in [`8814d39`](https://github.com/nRF24/RF24/commit/8814d39c4505e2ff7b0600f28eaa52735bcfc85f)
-- Slight fix for makefile and RF24.h define by \@TMRh20 in [`1da112a`](https://github.com/nRF24/RF24/commit/1da112a6d574f72a142f9136f469505ff18f7f7c)
-- Minor change to readme by \@TMRh20 in [`663f41b`](https://github.com/nRF24/RF24/commit/663f41bb02027846bc818a28d5adacc1814f9bc6)
-- Another correction RPi code merge (install info) by \@TMRh20 in [`b007fb4`](https://github.com/nRF24/RF24/commit/b007fb4a123eed1e1434dd07bd67410964fe6143)
-- Reliability improvements for RPi by \@TMRh20 in [`d41d47a`](https://github.com/nRF24/RF24/commit/d41d47ab20cb794b8250560154076b1b2b06feae)
-- Revert last commit, if defined... delay by \@TMRh20 in [`deef592`](https://github.com/nRF24/RF24/commit/deef592bb04729aae5bbd61bce4b31629496b7cd)
-- Python wrapper for RPi added by \@martin-mat in [`567ca69`](https://github.com/nRF24/RF24/commit/567ca69234c5c51bbe6ae7f68b3fc6e350c3a6bb)
-- Merge pull request \#35 from mz-fuzzy/master by \@TMRh20 in [`a2954f8`](https://github.com/nRF24/RF24/commit/a2954f8f42b97d84f64c5753201cc8a1b3b482fc)
-- Revert change to delay from last commit by \@TMRh20 in [`58293d6`](https://github.com/nRF24/RF24/commit/58293d6fe48c13f3e4ddc35bd7ac2767fd0660ea)
-- Non-conflicting names by \@jfktrey in [`1650b6b`](https://github.com/nRF24/RF24/commit/1650b6bd58baded2e53e0267bd9268e55a60b675)
-- Merge pull request \#38 from jfktrey/master by \@TMRh20 in [`50450a9`](https://github.com/nRF24/RF24/commit/50450a9fe363d7f549497137b1d9587d715e73a1)
-- Intel Gallileo support added in [`83dccd2`](https://github.com/nRF24/RF24/commit/83dccd282d75018a7970240b366db768035a1df5)
-- Optimization for Galileo Delay by \@spaniakos in [`7574bf5`](https://github.com/nRF24/RF24/commit/7574bf51ca5330beecd83879eaeb35ee53049362)
-- Galileo Optimizations and FIFO Fix by \@spaniakos in [`0969010`](https://github.com/nRF24/RF24/commit/0969010b6d3a2f2da956a352e60eef009dfe7515)
-- Galileo Optimizations by \@spaniakos in [`e13b238`](https://github.com/nRF24/RF24/commit/e13b238be108fa0a5ed1a2bb829242ed0edd3203)
-- Merge pull request \#40 from spaniakos/master by \@TMRh20 in [`aace3b4`](https://github.com/nRF24/RF24/commit/aace3b4bd7ca157303fa964bbc9ade7ac20056a9)
-- Updated led_example.pde to work with newer version of library. by \@k2OS in [`65d7fc1`](https://github.com/nRF24/RF24/commit/65d7fc1606dcb4cdd1ecbf0e4eef0f5dc6f9d983)
-- Merge pull request \#45 from k2OS/master by \@TMRh20 in [`a0c8087`](https://github.com/nRF24/RF24/commit/a0c808751c4239d5c692588b6730f5fbda7c6954)
-- Lower default SPI clock speed by \@TMRh20 in [`3515538`](https://github.com/nRF24/RF24/commit/3515538781ea714a9f4bb5f7313cd2abe676b601)
-- Merge pull request \#50 from mz-fuzzy/pyRF24fix by \@TMRh20 in [`350e00a`](https://github.com/nRF24/RF24/commit/350e00a0d4ef8e47224c241f1167b3ce1c375581)
-- Update many of the example files by \@TMRh20 in [`d05a356`](https://github.com/nRF24/RF24/commit/d05a356270650adc9d4e98f56362cd6deb373a0e)
-- Enable hardware warnings by default on linux by \@TMRh20 in [`831a424`](https://github.com/nRF24/RF24/commit/831a424d3ba1e75dbb7bbcdc4f68b65165201601)
-- Update python readme and example by \@TMRh20 in [`714999c`](https://github.com/nRF24/RF24/commit/714999c186466a97a74a151e3713b7e19caae015)
-- Attempt to correct markdown formatting in readme by \@TMRh20 in [`3c28f13`](https://github.com/nRF24/RF24/commit/3c28f1307ce492e5110426146a4ebb9ccb34e860)
-- Attempt 2 to fix python readme formatting by \@TMRh20 in [`54daf66`](https://github.com/nRF24/RF24/commit/54daf66fc129f38fd52a09ebc58047b21697f52c)
-- Updated for using LittleWire by \@lnxbil in [`36fc1f1`](https://github.com/nRF24/RF24/commit/36fc1f10aeaa4d366e7efe4c533589b495453d3e)
-- Ignoring DS_Store files on MacOS by \@lnxbil in [`6d6f185`](https://github.com/nRF24/RF24/commit/6d6f185365853822368e15213464b5922533fb5c)
-- Slight mods to LittleWire code changes by \@TMRh20 in [`ba4b8a3`](https://github.com/nRF24/RF24/commit/ba4b8a34ea4112aca9f5d1c14536f0e3d6d79698)
-- Merge branch 'lnxbil-littlewire' by \@TMRh20 in [`1e05097`](https://github.com/nRF24/RF24/commit/1e050979899096e7528e122595e37b99d87897e1)
-- Enable buffered writes/transmissions by \@TMRh20 in [`08480a3`](https://github.com/nRF24/RF24/commit/08480a3b3750e2c44263631c2008682122b9b029)
-- Adapted python wrapper for RF24 interface changes in txStandBy and startFastWrite by \@martin-mat in [`8d68102`](https://github.com/nRF24/RF24/commit/8d681027a8ffcf1318ec85c0df5cf920202a6965)
-- Merge remote-tracking branch 'TMRh20/master' into pyRF24fix by \@martin-mat in [`b2e40bc`](https://github.com/nRF24/RF24/commit/b2e40bcceaa4250976e9ceab31091c89d10f8ad6)
-- Merge pull request \#65 from mz-fuzzy/pyRF24fix by \@TMRh20 in [`a46779f`](https://github.com/nRF24/RF24/commit/a46779fad0f52ffffd1e43a4fd1e3214aed17011)
-- Merge pull request \#66 from ax7884/master by \@TMRh20 in [`4b435c9`](https://github.com/nRF24/RF24/commit/4b435c99fdc39de0f31d3798aad667cbf5a48a4e)
-- Tweak CONFIG register on radio startup. by \@dsbaha in [`a27b840`](https://github.com/nRF24/RF24/commit/a27b84063269385249f46958f85181ddf2894d69)
-- Merge pull request \#67 from dsbaha/master by \@TMRh20 in [`e3f9f9a`](https://github.com/nRF24/RF24/commit/e3f9f9aa395441bd42adf74c527cc9904b590d17)
-- Merge remote-tracking branch 'origin/master' into Updates by \@TMRh20 in [`3c652ed`](https://github.com/nRF24/RF24/commit/3c652ed62b2007012b39d4c4bc4190a0b721371c)
-- Rough port for BBB \#69 by \@TMRh20 in [`09269a3`](https://github.com/nRF24/RF24/commit/09269a355759c49854ae844a903ac74143ac7fe8)
-- \#69 - Forgot to include the main config changes by \@TMRh20 in [`2254bbf`](https://github.com/nRF24/RF24/commit/2254bbf7d5e90b4fe2b619d621f0045b421fa83a)
-- Move Due and ATTiny to new template format by \@TMRh20 in [`e7deb68`](https://github.com/nRF24/RF24/commit/e7deb6843828ea729e5fea121166bbb9f83ec4eb)
-- Merge pull request \#72 from mannkind/Updates by \@TMRh20 in [`f06ca7c`](https://github.com/nRF24/RF24/commit/f06ca7cb86ce7a0ec5e22174bf8c8b551e2b9ebe)
-- Transitioning to new hardware support template by \@TMRh20 in [`e2abd64`](https://github.com/nRF24/RF24/commit/e2abd640a296e1be9b2abc0d27bbd5caa1affa78)
-- Restore bcm updates from \#72 by \@TMRh20 in [`2ca76c6`](https://github.com/nRF24/RF24/commit/2ca76c6b24c660a81e9cdbb279ca9576b83bbf39)
-- Update for generic spidev/Linux support by \@TMRh20 in [`84f4590`](https://github.com/nRF24/RF24/commit/84f4590dff3c4e4ff0daf7af446d1f25fb21f6f9)
-- Update Makefile for LittleWire by \@TMRh20 in [`02b9b16`](https://github.com/nRF24/RF24/commit/02b9b1630366bed83e267d806f0e382c2ebce0c5)
-- MRAA support tweaks by \@TMRh20 in [`3d049ab`](https://github.com/nRF24/RF24/commit/3d049abfe890225bb8232f2a025e7415e731e6e2)
-- Merge pull request \#75 from prophet-roshak/mraa by \@TMRh20 in [`350cafb`](https://github.com/nRF24/RF24/commit/350cafbce914598917397473dec93ebe728a7284)
-- Memory handling with MRAA device contexts by \@prophet-roshak in [`e78893b`](https://github.com/nRF24/RF24/commit/e78893bf7189d534323ecd6fd05bcdf446da9410)
-- Memory handling with MRAA device contexts, minor optimizations by \@prophet-roshak in [`2eb660f`](https://github.com/nRF24/RF24/commit/2eb660f64a31b82ffc77f63733092900896e8b6a)
-- Merge pull request \#76 from prophet-roshak/mraa by \@TMRh20 in [`225052a`](https://github.com/nRF24/RF24/commit/225052a3c06af786e0085c22680bb4b610bd3a10)
-- Update note in gettingstarted example by \@TMRh20 in [`18e6775`](https://github.com/nRF24/RF24/commit/18e67756e4b014d7828592eef5cb15c88cf48903)
-- BBB/SPIDEV changes by \@TMRh20 in [`40b907c`](https://github.com/nRF24/RF24/commit/40b907c318b2046edcae761084242838bdfb0d96)
-- Cleanup RF24_config.h, add Teensy to arch/ support by \@TMRh20 in [`30a01d7`](https://github.com/nRF24/RF24/commit/30a01d74190d726e3a1bed9da8dbb961e107f4a5)
-- Merge pull request \#78 from prophet-roshak/mraa by \@TMRh20 in [`71337bd`](https://github.com/nRF24/RF24/commit/71337bd48e69e77d75a6aeac7c54f4021a25071c)
-- Unify RF24 constructor API for all Linux platforms by \@TMRh20 in [`bd5ad6b`](https://github.com/nRF24/RF24/commit/bd5ad6b90c325a1bde6b1be015611ea8e673aeb1)
-- Update Makefile with better RPi detection by \@TMRh20 in [`4120b18`](https://github.com/nRF24/RF24/commit/4120b18361723607590be7b967df48ddaa76f38e)
-- Merge pull request \#83 from jorihardman/master by \@TMRh20 in [`d28cfcb`](https://github.com/nRF24/RF24/commit/d28cfcbf19b9d132d4135c0f311bff58184a8830)
-- Merge branch 'master' of https://github.com/TMRh20/RF24 by \@TMRh20 in [`d577379`](https://github.com/nRF24/RF24/commit/d57737978da8456e28e765a9676bee91934cb510)
-- Transactions beta by \@nerdralph in [`c02a51c`](https://github.com/nRF24/RF24/commit/c02a51c25b1a85f025f8174355412cdabf6e7c8c)
-- Merge branch 'Updates' of https://github.com/nerdralph/RF24 into Updates by \@TMRh20 in [`3cc10bb`](https://github.com/nRF24/RF24/commit/3cc10bb6093d7c234d23cf0d80bb70a4a6247a4c)
-- Initialize setup variable by \@TMRh20 in [`4445842`](https://github.com/nRF24/RF24/commit/444584238db1f76439cb184d8ed859f47ac946ed)
-- Change printf to serial.print in transfer example by \@TMRh20 in [`da0c594`](https://github.com/nRF24/RF24/commit/da0c5943c040f29d3957947cc46a4f94dd35492c)
-- Use SPI_HAS_TRANSACTION to detect transaction API by \@TMRh20 in [`28c363f`](https://github.com/nRF24/RF24/commit/28c363f4965ad4059e108a0a4921a64e4e737cac)
-- Adjust spi transaction detection again by \@TMRh20 in [`dceeabb`](https://github.com/nRF24/RF24/commit/dceeabb3423044e008906ba4a95940271da983bc)
-- Update GettingStarted.ino by \@Interneedus in [`6f5e954`](https://github.com/nRF24/RF24/commit/6f5e95494c34b827c803b29c5c342ee96c71c45a)
-- Merge pull request \#103 from Interneedus/patch-1 by \@TMRh20 in [`638b199`](https://github.com/nRF24/RF24/commit/638b199b173f771902020445f42bedfed3fdc6a8)
-- Update Transfer.ino by \@Interneedus in [`51600d6`](https://github.com/nRF24/RF24/commit/51600d69034b5f74944adedcbb4fdce6d122e4b4)
-- Merge pull request \#104 from Interneedus/patch-2 by \@TMRh20 in [`5896d62`](https://github.com/nRF24/RF24/commit/5896d62c2859811fb42d38debf4ba7d7b3359258)
-- Update scanner.ino by \@Interneedus in [`7ad1c2f`](https://github.com/nRF24/RF24/commit/7ad1c2f0c621c0cf1c87112459673dbbfdd7e883)
-- Merge pull request \#105 from Interneedus/patch-3 by \@TMRh20 in [`a75fd1f`](https://github.com/nRF24/RF24/commit/a75fd1f4cac3eb2b9c82288f8575735840deb649)
-- Merge pull request \#122 from ivankravets/patch-1 by \@TMRh20 in [`417e6e5`](https://github.com/nRF24/RF24/commit/417e6e523bd34b64b2e39d13d9d883488cd51f57)
-- Modify printDetails() per \#121 by \@TMRh20 in [`594a949`](https://github.com/nRF24/RF24/commit/594a949b4be911430ccdc91d0d2d8a60d288afbf)
-- ESP8266 Support per \@crcastle by \@TMRh20 in [`cd52d61`](https://github.com/nRF24/RF24/commit/cd52d61bc08c3c3e46b5164a056b29e61fdf2689)
-- Merge branch 'master' of https://github.com/TMRh20/RF24 by \@komby in [`0a8b1d3`](https://github.com/nRF24/RF24/commit/0a8b1d3df28a50bb189b3939da78c20a9b8ed0da)
-- Merge pull request \#129 from komby/master by \@TMRh20 in [`16c49cb`](https://github.com/nRF24/RF24/commit/16c49cbbf33cc4ad31ffeb09e835768385880665)
-- Change %S to %s for ESP8266 by \@TMRh20 in [`ded7e1b`](https://github.com/nRF24/RF24/commit/ded7e1bc7dbe83490452106bd2677ca4eafd37c1)
-- Merge branch 'master' into Updates by \@TMRh20 in [`2db0f2e`](https://github.com/nRF24/RF24/commit/2db0f2e659894ba82f32fa7400639170d6c6b79d)
-- Redefine PROGMEM variables for ESP8266 by \@TMRh20 in [`14ed863`](https://github.com/nRF24/RF24/commit/14ed8638de5815fb38e88fe5d4a8daeaacbf6f20)
-- Fix for SPIDEV on 4.1.7+ by \@TMRh20 in [`ded2157`](https://github.com/nRF24/RF24/commit/ded2157c0ba68e74e304e2e968e72c406f008875)
-- Merge branch 'Updates' by \@TMRh20 in [`5296c16`](https://github.com/nRF24/RF24/commit/5296c16664f1ac22218fdec741a8d67ee3e8b58c)
-- Create library.properties by \@Avamander in [`f824302`](https://github.com/nRF24/RF24/commit/f8243024523a14b8216b3a3df97359302028ee94)
-- Merge pull request \#140 from Avamander/patch-1 by \@TMRh20 in [`45d085b`](https://github.com/nRF24/RF24/commit/45d085bdc2b9fc3794e59fc297fcf95ccf4936b5)
-- Update library.properties by \@Avamander in [`b4e1fa7`](https://github.com/nRF24/RF24/commit/b4e1fa7b13c1c5cd92fc806bc070f2298f34b8ea)
-- Merge pull request \#142 from Avamander/patch-1 by \@TMRh20 in [`2e5b360`](https://github.com/nRF24/RF24/commit/2e5b36006a44df481dac64c8b6fb3ab540434734)
-- Rename arch folder to utility by \@TMRh20 in [`55b034e`](https://github.com/nRF24/RF24/commit/55b034eeb20c5bc838b7dc5d433162b8180860b8)
-- Reverting library properties and releases by \@TMRh20 in [`517326e`](https://github.com/nRF24/RF24/commit/517326e164feeb35e7e54440a8c4b71c042d3f14)
-
-[1.0]: https://github.com/nRF24/RF24/compare/de083c964d9aeeb9fda7485c39fed27443cd617c...v1.0
-
-Full commit diff: [`de083c9...v1.0`][1.0]
-
-## New Contributors
-
-- \@TMRh20 made their first contribution
-- \@Avamander made their first contribution
-- \@komby made their first contribution
-- \@ivankravets made their first contribution
-- \@Interneedus made their first contribution
-- \@nerdralph made their first contribution
-- \@jorihardman made their first contribution
-- \@prophet-roshak made their first contribution
-- \@mannkind made their first contribution
-- \@dsbaha made their first contribution
-- \@ax7884 made their first contribution
-- \@martin-mat made their first contribution
-- \@lnxbil made their first contribution
-- \@k2OS made their first contribution
-- \@spaniakos made their first contribution
-- \@ made their first contribution
-- \@jfktrey made their first contribution
-- \@reixd made their first contribution
-- \@a-lurker made their first contribution
-- \@cornet made their first contribution
-- \@zephyrr made their first contribution
-- \@maniacbug made their first contribution
-- \@gcopeland made their first contribution
-
-<!-- generated by git-cliff -->
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/COMMON_ISSUES.md b/.pio/libdeps/esp32-s3-n16r8/RF24/COMMON_ISSUES.md
deleted file mode 100644
index 3a7c089..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/COMMON_ISSUES.md
+++ /dev/null
@@ -1,175 +0,0 @@
-# Common Issues
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 -->
-
-## Simple Troubleshooting
-
-When troubleshooting, users can start with the included gettingStarted
-sketch as it contains all the info needed to troubleshoot an RF24 radio.
-
-1. If `radio.begin()` returns false, the MCU and radio are not "talking"
-successfully with each other. Verify pin connections and wiring.
-2. If `radio.begin()` returns true, but the devices are not communicating,
-users can uncomment the lines `printf_begin()` & `radio.printDetails()` and
- view the settings. They should appear as the following:
-
- ```text
- SPI Speedz = 10 Mhz
- STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
- RX_ADDR_P0-1 = 0x65646f4e31 0x65646f4e32
- RX_ADDR_P2-5 = 0x33 0xce 0x3e 0xe3
- TX_ADDR = 0x65646f4e31
- RX_PW_P0-6 = 0x04 0x04 0x04 0x04 0x04 0x04
- EN_AA = 0x3f
- EN_RXADDR = 0x02
- RF_CH = 0x4c
- RF_SETUP = 0x03
- CONFIG = 0x0f
- DYNPD/FEATURE = 0x00 0x00
- Data Rate = 1 MBPS
- Model = nRF24L01+
- CRC Length = 16 bits
- PA Power = PA_LOW
- ARC = 0
- ```
- If the settings do not appear as above, troubleshoot wiring, pin
- connections, etc.
-
-3. If both of the above check out, the problem is likely the CE pin is wired wrong, or
-even hardware issues (bad radios etc.) See the following.
-
-## Settings that must match
-
-Before you report undesirable behavior, please make sure that the
-following RF24 configurations match on both receiving and transmitting
-nRF24L01 transceivers:
-
-1. `RF24::setAddressWidth()`
-2. `RF24::setChannel()`
-3. `RF24::setDataRate()`
-4. `RF24::setAutoAck()`
-5. `RF24::enableDynamicPayloads()` or `RF24::disableDynamicPayloads()`
-6. `RF24::enableAckPayload()` or `RF24::disableAckPayload()` (requires auto-ack and
- dynamic payloads features)
-7. `RF24::setPayloadSize()` (only if the dynamic payloads feature is disabled -- it is disabled by default)
-8. `RF24::setCRCLength()` or `RF24::disableCRC()` (the auto-ack feature
- automatically enables CRC because it is required)
-
-Also, it helps to think of an address as a path (a commonly shared route)
-instead of an identifying device destination. This means that addresses
-have to match for a payload to travel from one transceiver to another.
-However, the pipe numbers assigned with the matching address do not have
-to match. You can think of pipes as parking spots for the packets, while
-all packets' payloads live in a TX or RX FIFO buffer. Remember that the
-TX FIFO buffers and the RX FIFO buffers both have a maximum occupancy of
-3 payloads (regardless of the maximum 32-byte payload size).
-
-## Prohibited usage of write*() in Interrupt Service Routine callbacks
-
-Because the RF24 library uses `millis()` to implement a timeout and `delay()` for mandatory wait times, the following functions cannot be used within an ISR callback method:
-
-- `RF24::write()`
-- `RF24::writeBlocking()`
-- `RF24::writeFast()`
-- `RF24::startWrite()`
-- `RF24::txStandBy()` & `RF24::txStandBy(uint32_t, bool)`
-- `RF24::powerUp()`
-- `RF24::startListening()`
-- `RF24::stopListening()`
-
-@see The note in the documentation for `RF24::available()`.
-
-More info about why you can't call `millis()` (or `delay()`) from an ISR callback function is available at [the Arduino docs](https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/&ved=2ahUKEwjMhtSRl5jzAhVUsp4KHWIPCrIQFnoECAoQAQ&usg=AOvVaw1X9H0058Nz7Hck91VIC3bD).
-
-## Which write*() function do I use?
-
-### Standard
-
-`RF24::write()`: The standard write function, this is the most commonly used way to send data over radio link. This function will block until data is sent successfully. This means that if Auto-Ack is enabled, the radio will write the packet and wait for a response from the receiving radio. If Auto-Ack is disabled, the function will return sooner, as it will not wait for a response from the receiving radio.
-
-`RF24::startWrite()`: Can be used similar to the standard `RF24::write()` function, but it will not block. Useful for writing data outside of an interrupt routine, triggering that interrupt. Contains a `delayMicroseconds()` call for faster MCUs/devices to ensure the CE pin is toggled for a full 10us.
-
-### Advanced: (requires calling `RF24::txStandBy()`)
-
-`RF24::writeFast()`: Used for high-speed streaming of data. This function can be used to transmit data by simply placing data in the 3-layer FIFO buffers if room is available, or blocking until available. The function will return after a packet is placed in the buffer, or when a packet fails to transmit, in which case the buffers are cleared.
-
-`RF24::writeBlocking()`: Not commonly used, this function will first check the 3-layer FIFO for available space, then block until a timeout period is met if packets are failing, or return once there is room in the FIFO buffer and a packet is placed there.
-
-### Interrupt Safe Functions
-
-`RF24::startFastWrite()`: Can be used to write data and return immediately, without going into standBy mode. Can be used to transmit data at high speeds using interrupts, but will easily overflow the FIFO buffer if attempting to send data faster than the radio will process it.
-
-Again, some of the other functions can technically be placed inside interrupt routines, but rely on millis() for timeouts etc. and this functionality will not typically work within an interrupt routine. Advanced users can comment out `FAILURE_HANDLING` in `RF24_config.h` to disable some of this functionality on non-linux devices to make functions like `RF24::txStandBy()` interrupt-safe.
-
-## Here are the most common issues and their solutions
-
-### write() always returns true after setAutoAck(false)
-
-Don't disabled the auto-ack feature. RF24::write() has no reason to doubt
-that the payload was delivered if the auto-ack feature is disabled. We
-recommend you read the docs about RF24::setAutoAck() before disabling the
-auto-ack feature.
-
-### write() returns false when the payload was received
-
-If the settings match on both endpoint transceivers, then this can only
-mean that the receiving nRF24L01 failed to send an acknowledgement (ACK)
-packet back to the transmitting nRF24L01. Usually this is due to
-instability (electric noise) in the power lines (VCC and GND) going to
-the receiving nRF24L01.
-
-If you're not receiving ACK packets correctly/reliably on data rates
-lower than 2MBPS, try adding a big capacitor close to the module/chip.
-Example issues: [#264](https://github.com/nRF24/RF24/issues/264)
-[#211](https://github.com/nRF24/RF24/issues/211).
-
-For reliability, please use Electrolytic or Tantalum capacitors. Ceramic
-capacitors may not be good enough (depending on the manufacturing source).
-
-### printDetails() outputs the unexpected value(s)
-
-This is likely due to the SPI speed being set up to 10MHz by default. We recommend:
-
-1. Make sure the wires are not loose, and try to avoid using long wires.
-2. If the previous point does not help, then try lowering the SPI speed like so
- ```cpp
- RF24 radio(7, 8, 4000000); // set SPI speed to 4MHz instead of default 10MHz
- ```
-
-In the RF24 library's beginnings, the default value was (prior to 2014) set to 4MHz.
-
-### Payloads received/sent are inaccurate
-
-If lowering the SPI speed (as noted above) does not fix this problem, then it is likely data misalignment.
-
-Inaccurate payloads can also happen because of differences in how certain systems store data in memory. The easiest way to ensure your data aligns between devices is to specify the size of variables in code. For example, use `uint32_t` instead of `unsigned long`, and use `__attribute__((__packed__))` for data structures if you don't align your data manually per the linked blog posts (see below).
-
-Newer users can use the `sizeof()` function to verify the size of different variables or data structures as well.
-
-See [GNU libc doc about integers](https://www.gnu.org/software/libc/manual/html_node/Integers.html) and [TMRh20's Blog Post](https://tmrh20.blogspot.com/2020/09/transferring-data-between-systems-using.html) for more info.
-
-### My PA/LNA module fails to transmit
-
-You may find variants of the nRF24L01 transceiver that are marketed as “nRF24L01+PA+LNA”. These modules are distinct in the fact that they come with a detachable (SMA-type) antenna. They employ separate RFX24C01 IC with the antenna for enhanced Power Amplification (PA) and Low Noise Amplification (LNA) features. While they boast greater range with the same functionality, they are subject to a couple lesser known (and lesser advertised) drawbacks:
-
-1. Stronger power source. Below is a chart of advertised current requirements that many MCU boards’ 3V regulators may not be able to provide (after supplying power to internal components).
- | Specification | Value |
- |:-------------:|:-----:|
- | Emission mode current(peak) | 115 mA |
- | Receive Mode current(peak) | 45 mA |
- | Power-down mode current | 4.2 µA |
-
-2. Needs shielding from electromagnetic interference. Shielding usually works best when it has a path to ground (GND pin), but this connection to the GND pin is not required. It is important that the shielding does not touch any current carrying parts.
- - Professionals tend to use a faraday cage/mesh to implement electromagnetic shielding, but it can be pricey for this scenario.
- - A quick do-it-yourself solution (as proof-of-concept) would be to wrap the PA/LNA module with electrical tape and then wrap foil around the electrical tape (for shielding) while being very careful to not let the foil touch any current carrying parts (like the GPIO pins, the antenna mount, and the soldier joints for the antenna mount).
-
- Observe:
- ![ghetto_shielding_1.png](images/ghetto_sheilding_1.png){width=30%} ![ghetto_shielding_2.png](images/ghetto_sheilding_2.png){width=30%}
-
-### My PA/LNA module doesn't perform as well as I'd hoped or the NRF radio works better on touching it
-
-As described above, the radio modules (notably the PA+LNA versions) are reliant on a stable power source. While these modules may work with a poor power supply, they often lose packets or fail to receive as many as a module with a better power source. Moreover, this can sometimes be seen in odd ways such as the radio module working better when touched. This again is likely a power stability issue because the radio module is missing a capacitor (a commonly neglected expense on behalf of the module's manufacturer).
-
-Add capacitor(s) close to the VCC and GND pins of the radio. Typically, 10uF is enough. Depending upon your circuit's layout, differences in capacitors' electrolytic properties can be seen, such that a low ESR (Equivalent Series Resistance) rated capacitor is desirable.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/CONTRIBUTING.md b/.pio/libdeps/esp32-s3-n16r8/RF24/CONTRIBUTING.md
deleted file mode 100644
index 39d102a..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/CONTRIBUTING.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Contributing guidelines
-
-These are the current requirements for getting your code included in RF24:
-
-- Try your best to follow the rest of the code, if you're unsure then [the NASA C style guide](https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19950022400.pdf) can help as it's closest to the current style.
-
-- Definitely follow [PEP-8](https://www.python.org/dev/peps/pep-0008/) if it's Python code.
-
-- Follow the [Arduino example formatting style](https://docs.arduino.cc/learn/contributions/arduino-writing-style-guide) for Arduino examples
-
-- Add [doxygen-compatible documentation](https://www.doxygen.nl/manual/docblocks.html) to any new functions you add, or update existing documentation if you change behavior
-
-- CMake modules and CMakeLists.txt files should also have a uniform syntax.
- - Indentation is a mandatory 4 spaces (not a `\t` character).
- - Closing parenthesis for multi-line commands should have the same indentation as the line that opened the parenthesis.
- - For other useful CMake syntax convention, please see [CMake docs for developers](https://cmake.org/cmake/help/v3.20/manual/cmake-developer.7.html) and [this useful best CMake practices article](https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1). The qiBuild project has some [well-reasoned "Dos & Don'ts" guideline](http://doc.aldebaran.com/qibuild/hacking/contrib/cmake/coding_guide.html), but beware that the nRF24 organization is not related to the qiBuild project in any way.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/LICENSE b/.pio/libdeps/esp32-s3-n16r8/RF24/LICENSE
deleted file mode 100644
index 9dc3f92..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- {description}
- Copyright (C) {year} {full name}
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- SomeProgram version 69, Copyright (C) year name of author
- SomeProgram comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w` and `show c` should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w` and `show c`; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- SomeCompany, Inc., hereby disclaims all copyright interest in the program
- 'SomeProgram' (which makes passes at compilers) written by James Hacker.
-
- {signature of Ty Coon}, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/README.md b/.pio/libdeps/esp32-s3-n16r8/RF24/README.md
deleted file mode 100644
index e8cb896..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- markdownlint-disable MD041 MD034 -->
-[![Arduino CLI build](https://github.com/nRF24/RF24/actions/workflows/build_arduino.yml/badge.svg)](https://github.com/nRF24/RF24/actions/workflows/build_arduino.yml)
-[![Linux build](https://github.com/nRF24/RF24/actions/workflows/build_linux.yml/badge.svg)](https://github.com/nRF24/RF24/actions/workflows/build_linux.yml)
-[![PlatformIO build](https://github.com/nRF24/RF24/actions/workflows/build_platformIO.yml/badge.svg)](https://github.com/nRF24/RF24/actions/workflows/build_platformIO.yml)
-[![RP2xxx build](https://github.com/nRF24/RF24/actions/workflows/build_rp2xxx.yml/badge.svg)](https://github.com/nRF24/RF24/actions/workflows/build_rp2xxx.yml)
-[![Documentation Status](https://readthedocs.org/projects/rf24/badge/?version=latest)](https://rf24.readthedocs.io/en/latest/?badge=latest)
-
-# See http://nRF24.github.io/RF24 for all documentation
-
-## Having problems?
-
-Please read our **[solutions to common problems](COMMON_ISSUES.md)**. If that doesn't help, then open an issue describing your problem with as much detail as possible.
-
-### Want to contribute?
-
-Awesome! However, please check our [contributing guidelines](CONTRIBUTING.md) before opening a pull request.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/RF24.cpp b/.pio/libdeps/esp32-s3-n16r8/RF24/RF24.cpp
deleted file mode 100644
index 3b923b2..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/RF24.cpp
+++ /dev/null
@@ -1,2209 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
- */
-
-#include "nRF24L01.h"
-#include "RF24_config.h"
-#include "RF24.h"
-
-/****************************************************************************/
-
-void RF24::csn(bool mode)
-{
-#if defined(RF24_TINY)
- if (ce_pin != csn_pin) {
- digitalWrite(csn_pin, mode);
- }
- else {
- if (mode == HIGH) {
- PORTB |= (1 << PINB2); // SCK->CSN HIGH
- delayMicroseconds(RF24_CSN_SETTLE_HIGH_DELAY); // allow csn to settle.
- }
- else {
- PORTB &= ~(1 << PINB2); // SCK->CSN LOW
- delayMicroseconds(RF24_CSN_SETTLE_LOW_DELAY); // allow csn to settle
- }
- }
- // Return, CSN toggle complete
- return;
-
-#elif defined(ARDUINO) && !defined(RF24_SPI_TRANSACTIONS)
- // Minimum ideal SPI bus speed is 2x data rate
- // If we assume 2Mbs data rate and 16Mhz clock, a
- // divider of 4 is the minimum we want.
- // CLK:BUS 8Mhz:2Mhz, 16Mhz:4Mhz, or 20Mhz:5Mhz
-
- #if !defined(SOFTSPI)
- // applies to SPI_UART and inherent hardware SPI
- #if defined(RF24_SPI_PTR)
- _spi->setBitOrder(MSBFIRST);
- _spi->setDataMode(SPI_MODE0);
-
- #if !defined(F_CPU) || F_CPU < 20000000
- _spi->setClockDivider(SPI_CLOCK_DIV2);
- #elif F_CPU < 40000000
- _spi->setClockDivider(SPI_CLOCK_DIV4);
- #elif F_CPU < 80000000
- _spi->setClockDivider(SPI_CLOCK_DIV8);
- #elif F_CPU < 160000000
- _spi->setClockDivider(SPI_CLOCK_DIV16);
- #elif F_CPU < 320000000
- _spi->setClockDivider(SPI_CLOCK_DIV32);
- #elif F_CPU < 640000000
- _spi->setClockDivider(SPI_CLOCK_DIV64);
- #elif F_CPU < 1280000000
- _spi->setClockDivider(SPI_CLOCK_DIV128);
- #else // F_CPU >= 1280000000
- #error "Unsupported CPU frequency. Please set correct SPI divider."
- #endif // F_CPU to SPI_CLOCK_DIV translation
-
- #else // !defined(RF24_SPI_PTR)
- _SPI.setBitOrder(MSBFIRST);
- _SPI.setDataMode(SPI_MODE0);
-
- #if !defined(F_CPU) || F_CPU < 20000000
- _SPI.setClockDivider(SPI_CLOCK_DIV2);
- #elif F_CPU < 40000000
- _SPI.setClockDivider(SPI_CLOCK_DIV4);
- #elif F_CPU < 80000000
- _SPI.setClockDivider(SPI_CLOCK_DIV8);
- #elif F_CPU < 160000000
- _SPI.setClockDivider(SPI_CLOCK_DIV16);
- #elif F_CPU < 320000000
- _SPI.setClockDivider(SPI_CLOCK_DIV32);
- #elif F_CPU < 640000000
- _SPI.setClockDivider(SPI_CLOCK_DIV64);
- #elif F_CPU < 1280000000
- _SPI.setClockDivider(SPI_CLOCK_DIV128);
- #else // F_CPU >= 1280000000
- #error "Unsupported CPU frequency. Please set correct SPI divider."
- #endif // F_CPU to SPI_CLOCK_DIV translation
- #endif // !defined(RF24_SPI_PTR)
- #endif // !defined(SOFTSPI)
-
-#elif defined(RF24_RPi)
- if (!mode)
- _SPI.chipSelect(csn_pin);
-#endif // defined(RF24_RPi)
-
-#if !defined(RF24_LINUX)
- digitalWrite(csn_pin, mode);
- delayMicroseconds(csDelay);
-#else
- static_cast<void>(mode); // ignore -Wunused-parameter
-#endif // !defined(RF24_LINUX)
-}
-
-/****************************************************************************/
-
-void RF24::ce(bool level)
-{
-#ifndef RF24_LINUX
- //Allow for 3-pin use on ATTiny
- if (ce_pin != csn_pin) {
-#endif
- digitalWrite(ce_pin, level);
-#ifndef RF24_LINUX
- }
-#endif
-}
-
-/****************************************************************************/
-
-inline void RF24::beginTransaction()
-{
-#if defined(RF24_SPI_TRANSACTIONS)
- #if defined(RF24_SPI_PTR)
- #if defined(RF24_RP2)
- _spi->beginTransaction(spi_speed);
- #else // ! defined (RF24_RP2)
- _spi->beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
- #endif // ! defined (RF24_RP2)
- #else // !defined(RF24_SPI_PTR)
- _SPI.beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
- #endif // !defined(RF24_SPI_PTR)
-#endif // defined (RF24_SPI_TRANSACTIONS)
- csn(LOW);
-}
-
-/****************************************************************************/
-
-inline void RF24::endTransaction()
-{
- csn(HIGH);
-#if defined(RF24_SPI_TRANSACTIONS)
- #if defined(RF24_SPI_PTR)
- _spi->endTransaction();
- #else // !defined(RF24_SPI_PTR)
- _SPI.endTransaction();
- #endif // !defined(RF24_SPI_PTR)
-#endif // defined (RF24_SPI_TRANSACTIONS)
-}
-
-/****************************************************************************/
-
-void RF24::read_register(uint8_t reg, uint8_t* buf, uint8_t len)
-{
-#if defined(RF24_LINUX) || defined(RF24_RP2)
- beginTransaction(); //configures the spi settings for RPi, locks mutex and setting csn low
- uint8_t* prx = spi_rxbuff;
- uint8_t* ptx = spi_txbuff;
- uint8_t size = static_cast<uint8_t>(len + 1); // Add register value to transmit buffer
-
- *ptx++ = reg;
-
- while (len--) {
- *ptx++ = nRF24L01::NOP; // Dummy operation, just for reading
- }
-
- #if defined(RF24_RP2)
- _spi->transfernb((const uint8_t*)spi_txbuff, spi_rxbuff, size);
- #else // !defined (RF24_RP2)
- _SPI.transfernb(reinterpret_cast<char*>(spi_txbuff), reinterpret_cast<char*>(spi_rxbuff), size);
- #endif // !defined (RF24_RP2)
-
- status = *prx++; // status is 1st byte of receive buffer
-
- // decrement before to skip status byte
- while (--size) {
- *buf++ = *prx++;
- }
-
- endTransaction(); // unlocks mutex and setting csn high
-
-#else // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- beginTransaction();
- #if defined(RF24_SPI_PTR)
- status = _spi->transfer(reg);
- while (len--) {
- *buf++ = _spi->transfer(0xFF);
- }
-
- #else // !defined(RF24_SPI_PTR)
- status = _SPI.transfer(reg);
- while (len--) {
- *buf++ = _SPI.transfer(0xFF);
- }
-
- #endif // !defined(RF24_SPI_PTR)
- endTransaction();
-#endif // !defined(RF24_LINUX) && !defined(RF24_RP2)
-}
-
-/****************************************************************************/
-
-uint8_t RF24::read_register(uint8_t reg)
-{
- uint8_t result;
-
-#if defined(RF24_LINUX) || defined(RF24_RP2)
- beginTransaction();
-
- uint8_t* prx = spi_rxbuff;
- uint8_t* ptx = spi_txbuff;
- *ptx++ = reg;
- *ptx++ = nRF24L01::NOP; // Dummy operation, just for reading
-
- #if defined(RF24_RP2)
- _spi->transfernb((const uint8_t*)spi_txbuff, spi_rxbuff, 2);
- #else // !defined(RF24_RP2)
- _SPI.transfernb(reinterpret_cast<char*>(spi_txbuff), reinterpret_cast<char*>(spi_rxbuff), 2);
- #endif // !defined(RF24_RP2)
-
- status = *prx; // status is 1st byte of receive buffer
- result = *++prx; // result is 2nd byte of receive buffer
-
- endTransaction();
-#else // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- beginTransaction();
- #if defined(RF24_SPI_PTR)
- status = _spi->transfer(reg);
- result = _spi->transfer(0xff);
-
- #else // !defined(RF24_SPI_PTR)
- status = _SPI.transfer(reg);
- result = _SPI.transfer(0xff);
-
- #endif // !defined(RF24_SPI_PTR)
- endTransaction();
-#endif // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- return result;
-}
-
-/****************************************************************************/
-
-void RF24::write_register(uint8_t reg, const uint8_t* buf, uint8_t len)
-{
-#if defined(RF24_LINUX) || defined(RF24_RP2)
- beginTransaction();
- uint8_t* prx = spi_rxbuff;
- uint8_t* ptx = spi_txbuff;
- uint8_t size = static_cast<uint8_t>(len + 1); // Add register value to transmit buffer
-
- *ptx++ = (nRF24L01::W_REGISTER | reg);
- while (len--) {
- *ptx++ = *buf++;
- }
-
- #if defined(RF24_RP2)
- _spi->transfernb((const uint8_t*)spi_txbuff, spi_rxbuff, size);
- #else // !defined(RF24_RP2)
- _SPI.transfernb(reinterpret_cast<char*>(spi_txbuff), reinterpret_cast<char*>(spi_rxbuff), size);
- #endif // !defined(RF24_RP2)
-
- status = *prx; // status is 1st byte of receive buffer
- endTransaction();
-#else // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- beginTransaction();
- #if defined(RF24_SPI_PTR)
- status = _spi->transfer(nRF24L01::W_REGISTER | reg);
- while (len--) {
- _spi->transfer(*buf++);
- }
-
- #else // !defined(RF24_SPI_PTR)
- status = _SPI.transfer(nRF24L01::W_REGISTER | reg);
- while (len--) {
- _SPI.transfer(*buf++);
- }
-
- #endif // !defined(RF24_SPI_PTR)
- endTransaction();
-#endif // !defined(RF24_LINUX) && !defined(RF24_RP2)
-}
-
-/****************************************************************************/
-
-void RF24::write_register(uint8_t reg, uint8_t value)
-{
- IF_RF24_DEBUG(printf_P(PSTR("write_register(%02x,%02x)\r\n"), reg, value));
-#if defined(RF24_LINUX) || defined(RF24_RP2)
- beginTransaction();
- uint8_t* prx = spi_rxbuff;
- uint8_t* ptx = spi_txbuff;
- *ptx++ = (nRF24L01::W_REGISTER | reg);
- *ptx = value;
-
- #if defined(RF24_RP2)
- _spi->transfernb((const uint8_t*)spi_txbuff, spi_rxbuff, 2);
- #else // !defined(RF24_RP2)
- _SPI.transfernb(reinterpret_cast<char*>(spi_txbuff), reinterpret_cast<char*>(spi_rxbuff), 2);
- #endif // !defined(RF24_RP2)
-
- status = *prx++; // status is 1st byte of receive buffer
- endTransaction();
-#else // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- beginTransaction();
- #if defined(RF24_SPI_PTR)
- status = _spi->transfer(nRF24L01::W_REGISTER | reg);
- _spi->transfer(value);
- #else // !defined(RF24_SPI_PTR)
- status = _SPI.transfer(nRF24L01::W_REGISTER | reg);
- _SPI.transfer(value);
- #endif // !defined(RF24_SPI_PTR)
- endTransaction();
-#endif // !defined(RF24_LINUX) && !defined(RF24_RP2)
-}
-
-/****************************************************************************/
-
-void RF24::write_payload(const void* buf, uint8_t data_len, const uint8_t writeType)
-{
- const uint8_t* current = reinterpret_cast<const uint8_t*>(buf);
-
- uint8_t blank_len = !data_len ? 1 : 0;
- if (!dynamic_payloads_enabled) {
- data_len = rf24_min(data_len, payload_size);
- blank_len = static_cast<uint8_t>(payload_size - data_len);
- }
- else {
- data_len = rf24_min(data_len, static_cast<uint8_t>(32));
- }
-
- //printf("[Writing %u bytes %u blanks]",data_len,blank_len);
- IF_RF24_DEBUG(printf_P("[Writing %u bytes %u blanks]\n", data_len, blank_len););
-
-#if defined(RF24_LINUX) || defined(RF24_RP2)
- beginTransaction();
- uint8_t* prx = spi_rxbuff;
- uint8_t* ptx = spi_txbuff;
- uint8_t size;
- size = static_cast<uint8_t>(data_len + blank_len + 1); // Add register value to transmit buffer
-
- *ptx++ = writeType;
- while (data_len--) {
- *ptx++ = *current++;
- }
-
- while (blank_len--) {
- *ptx++ = 0;
- }
-
- #if defined(RF24_RP2)
- _spi->transfernb((const uint8_t*)spi_txbuff, spi_rxbuff, size);
- #else // !defined(RF24_RP2)
- _SPI.transfernb(reinterpret_cast<char*>(spi_txbuff), reinterpret_cast<char*>(spi_rxbuff), size);
- #endif // !defined(RF24_RP2)
-
- status = *prx; // status is 1st byte of receive buffer
- endTransaction();
-
-#else // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- beginTransaction();
- #if defined(RF24_SPI_PTR)
- status = _spi->transfer(writeType);
- while (data_len--) {
- _spi->transfer(*current++);
- }
-
- while (blank_len--) {
- _spi->transfer(0);
- }
-
- #else // !defined(RF24_SPI_PTR)
- status = _SPI.transfer(writeType);
- while (data_len--) {
- _SPI.transfer(*current++);
- }
-
- while (blank_len--) {
- _SPI.transfer(0);
- }
-
- #endif // !defined(RF24_SPI_PTR)
- endTransaction();
-#endif // !defined(RF24_LINUX) && !defined(RF24_RP2)
-}
-
-/****************************************************************************/
-
-void RF24::read_payload(void* buf, uint8_t data_len)
-{
- uint8_t* current = reinterpret_cast<uint8_t*>(buf);
-
- uint8_t blank_len = 0;
- if (!dynamic_payloads_enabled) {
- data_len = rf24_min(data_len, payload_size);
- blank_len = static_cast<uint8_t>(payload_size - data_len);
- }
- else {
- data_len = rf24_min(data_len, static_cast<uint8_t>(32));
- }
-
- //printf("[Reading %u bytes %u blanks]",data_len,blank_len);
-
- IF_RF24_DEBUG(printf_P("[Reading %u bytes %u blanks]\n", data_len, blank_len););
-
-#if defined(RF24_LINUX) || defined(RF24_RP2)
- beginTransaction();
- uint8_t* prx = spi_rxbuff;
- uint8_t* ptx = spi_txbuff;
- uint8_t size;
- size = static_cast<uint8_t>(data_len + blank_len + 1); // Add register value to transmit buffer
-
- *ptx++ = nRF24L01::R_RX_PAYLOAD;
- while (--size) {
- *ptx++ = nRF24L01::NOP;
- }
-
- size = static_cast<uint8_t>(data_len + blank_len + 1); // Size has been lost during while, re affect
-
- #if defined(RF24_RP2)
- _spi->transfernb((const uint8_t*)spi_txbuff, spi_rxbuff, size);
- #else // !defined(RF24_RP2)
- _SPI.transfernb(reinterpret_cast<char*>(spi_txbuff), reinterpret_cast<char*>(spi_rxbuff), size);
- #endif // !defined(RF24_RP2)
-
- status = *prx++; // 1st byte is status
-
- if (data_len > 0) {
- // Decrement before to skip 1st status byte
- while (--data_len) {
- *current++ = *prx++;
- }
-
- *current = *prx;
- }
- endTransaction();
-#else // !defined(RF24_LINUX) && !defined(RF24_RP2)
-
- beginTransaction();
- #if defined(RF24_SPI_PTR)
- status = _spi->transfer(nRF24L01::R_RX_PAYLOAD);
- while (data_len--) {
- *current++ = _spi->transfer(0xFF);
- }
-
- while (blank_len--) {
- _spi->transfer(0xFF);
- }
-
- #else // !defined(RF24_SPI_PTR)
- status = _SPI.transfer(nRF24L01::R_RX_PAYLOAD);
- while (data_len--) {
- *current++ = _SPI.transfer(0xFF);
- }
-
- while (blank_len--) {
- _SPI.transfer(0xff);
- }
-
- #endif // !defined(RF24_SPI_PTR)
- endTransaction();
-
-#endif // !defined(RF24_LINUX) && !defined(RF24_RP2)
-}
-
-/****************************************************************************/
-
-uint8_t RF24::flush_rx(void)
-{
- read_register(nRF24L01::FLUSH_RX, (uint8_t*)nullptr, 0);
- IF_RF24_DEBUG(printf_P("[Flushing RX FIFO]"););
- return status;
-}
-
-/****************************************************************************/
-
-uint8_t RF24::flush_tx(void)
-{
- read_register(nRF24L01::FLUSH_TX, (uint8_t*)nullptr, 0);
- IF_RF24_DEBUG(printf_P("[Flushing RX FIFO]"););
- return status;
-}
-
-/****************************************************************************/
-#if !defined(MINIMAL)
-
-void RF24::printStatus(uint8_t flags)
-{
- printf_P(PSTR("RX_DR=%x TX_DS=%x TX_DF=%x RX_PIPE=%x TX_FULL=%x\r\n"),
- (flags & RF24_RX_DR) ? 1 : 0,
- (flags & RF24_TX_DS) ? 1 : 0,
- (flags & RF24_TX_DF) ? 1 : 0,
- (flags >> nRF24L01::RX_P_NO) & 0x07,
- (flags & _BV(nRF24L01::TX_FULL)) ? 1 : 0);
-}
-
-/****************************************************************************/
-
-void RF24::print_observe_tx(uint8_t value)
-{
- printf_P(PSTR("OBSERVE_TX=%02x: PLOS_CNT=%x ARC_CNT=%x\r\n"), value, (value >> nRF24L01::PLOS_CNT) & 0x0F, (value >> nRF24L01::ARC_CNT) & 0x0F);
-}
-
-/****************************************************************************/
-
-void RF24::print_byte_register(const char* name, uint8_t reg, uint8_t qty)
-{
- printf_P(PSTR(PRIPSTR
- "\t="),
- name);
- while (qty--) {
- printf_P(PSTR(" 0x%02x"), read_register(reg++));
- }
- printf_P(PSTR("\r\n"));
-}
-
-/****************************************************************************/
-
-void RF24::print_address_register(const char* name, uint8_t reg, uint8_t qty)
-{
-
- printf_P(PSTR(PRIPSTR
- "\t="),
- name);
- while (qty--) {
- uint8_t* buffer = new uint8_t[addr_width];
- read_register(reg++, buffer, addr_width);
-
- printf_P(PSTR(" 0x"));
- uint8_t* bufptr = buffer + addr_width;
- while (--bufptr >= buffer) {
- printf_P(PSTR("%02x"), *bufptr); // NOLINT: clang-tidy seems to emit a false positive about zero-allocated memory here (*bufptr)
- }
- delete[] buffer;
- }
- printf_P(PSTR("\r\n"));
-}
-
-/****************************************************************************/
-
-uint8_t RF24::sprintf_address_register(char* out_buffer, uint8_t reg, uint8_t qty)
-{
- uint8_t offset = 0;
- uint8_t* read_buffer = new uint8_t[addr_width];
- while (qty--) {
- read_register(reg++, read_buffer, addr_width);
- uint8_t* bufptr = read_buffer + addr_width;
- while (--bufptr >= read_buffer) {
- offset += sprintf_P(out_buffer + offset, PSTR("%02X"), *bufptr); // NOLINT(clang-analyzer-cplusplus.NewDelete)
- }
- }
- delete[] read_buffer;
- return offset;
-}
-#endif // !defined(MINIMAL)
-
-/****************************************************************************/
-
-RF24::RF24(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin, uint32_t _spi_speed)
- : ce_pin(_cepin),
- csn_pin(_cspin),
- spi_speed(_spi_speed),
- payload_size(32),
- _is_p_variant(false),
- _is_p0_rx(false),
- addr_width(5),
- dynamic_payloads_enabled(true),
-#if defined FAILURE_HANDLING
- failureDetected(0),
-#endif
- csDelay(5)
-{
- _init_obj();
-}
-
-/****************************************************************************/
-
-RF24::RF24(uint32_t _spi_speed)
- : ce_pin(RF24_PIN_INVALID),
- csn_pin(RF24_PIN_INVALID),
- spi_speed(_spi_speed),
- payload_size(32),
- _is_p_variant(false),
- _is_p0_rx(false),
- addr_width(5),
- dynamic_payloads_enabled(true),
-#if defined FAILURE_HANDLING
- failureDetected(0),
-#endif
- csDelay(5)
-{
- _init_obj();
-}
-
-/****************************************************************************/
-
-void RF24::_init_obj()
-{
- // Use a pointer on the Arduino platform
-
-#if defined(RF24_SPI_PTR) && !defined(RF24_RP2)
- _spi = &SPI;
-#endif // defined (RF24_SPI_PTR)
-
- if (spi_speed <= 35000) { //Handle old BCM2835 speed constants, default to RF24_SPI_SPEED
- spi_speed = RF24_SPI_SPEED;
- }
-}
-
-/****************************************************************************/
-
-void RF24::setChannel(uint8_t channel)
-{
- const uint8_t max_channel = 125;
- write_register(nRF24L01::RF_CH, rf24_min(channel, max_channel));
-}
-
-uint8_t RF24::getChannel()
-{
- return read_register(nRF24L01::RF_CH);
-}
-
-/****************************************************************************/
-
-void RF24::setPayloadSize(uint8_t size)
-{
- // payload size must be in range [1, 32]
- payload_size = static_cast<uint8_t>(rf24_max(1, rf24_min(32, size)));
-
- // write static payload size setting for all pipes
- for (uint8_t i = 0; i < 6; ++i) {
- write_register(static_cast<uint8_t>(nRF24L01::RX_PW_P0 + i), payload_size);
- }
-}
-
-/****************************************************************************/
-
-uint8_t RF24::getPayloadSize(void)
-{
- return payload_size;
-}
-
-/****************************************************************************/
-
-#if !defined(MINIMAL)
-
-static const PROGMEM char rf24_datarate_e_str_0[] = "= 1 MBPS";
-static const PROGMEM char rf24_datarate_e_str_1[] = "= 2 MBPS";
-static const PROGMEM char rf24_datarate_e_str_2[] = "= 250 KBPS";
-static const PROGMEM char* const rf24_datarate_e_str_P[] = {
- rf24_datarate_e_str_0,
- rf24_datarate_e_str_1,
- rf24_datarate_e_str_2,
-};
-static const PROGMEM char rf24_model_e_str_0[] = "nRF24L01";
-static const PROGMEM char rf24_model_e_str_1[] = "nRF24L01+";
-static const PROGMEM char* const rf24_model_e_str_P[] = {
- rf24_model_e_str_0,
- rf24_model_e_str_1,
-};
-static const PROGMEM char rf24_crclength_e_str_0[] = "= Disabled";
-static const PROGMEM char rf24_crclength_e_str_1[] = "= 8 bits";
-static const PROGMEM char rf24_crclength_e_str_2[] = "= 16 bits";
-static const PROGMEM char* const rf24_crclength_e_str_P[] = {
- rf24_crclength_e_str_0,
- rf24_crclength_e_str_1,
- rf24_crclength_e_str_2,
-};
-static const PROGMEM char rf24_pa_dbm_e_str_0[] = "= PA_MIN";
-static const PROGMEM char rf24_pa_dbm_e_str_1[] = "= PA_LOW";
-static const PROGMEM char rf24_pa_dbm_e_str_2[] = "= PA_HIGH";
-static const PROGMEM char rf24_pa_dbm_e_str_3[] = "= PA_MAX";
-static const PROGMEM char* const rf24_pa_dbm_e_str_P[] = {
- rf24_pa_dbm_e_str_0,
- rf24_pa_dbm_e_str_1,
- rf24_pa_dbm_e_str_2,
- rf24_pa_dbm_e_str_3,
-};
-
-static const PROGMEM char rf24_feature_e_str_on[] = "= Enabled";
-static const PROGMEM char rf24_feature_e_str_allowed[] = "= Allowed";
-static const PROGMEM char rf24_feature_e_str_open[] = " open ";
-static const PROGMEM char rf24_feature_e_str_closed[] = "closed";
-static const PROGMEM char* const rf24_feature_e_str_P[] = {
- rf24_crclength_e_str_0,
- rf24_feature_e_str_on,
- rf24_feature_e_str_allowed,
- rf24_feature_e_str_closed,
- rf24_feature_e_str_open,
-};
-
-void RF24::printDetails(void)
-{
-
- #if defined(RF24_LINUX)
- printf("================ SPI Configuration ================\n");
- uint8_t bus_ce = static_cast<uint8_t>(csn_pin % 10);
- uint8_t bus_numb = static_cast<uint8_t>((csn_pin - bus_ce) / 10);
- printf("CSN Pin\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
- printf("CE Pin\t\t= Custom GPIO%d\n", ce_pin);
- #endif
- printf_P(PSTR("SPI Speedz\t= %d Mhz\n"), static_cast<uint8_t>(spi_speed / 1000000)); //Print the SPI speed on non-Linux devices
- #if defined(RF24_LINUX)
- printf("================ NRF Configuration ================\n");
- #endif // defined(RF24_LINUX)
-
- uint8_t status = update();
- printf_P(PSTR("STATUS\t\t= 0x%02x "), status);
- printStatus(status);
-
- print_address_register(PSTR("RX_ADDR_P0-1"), nRF24L01::RX_ADDR_P0, 2);
- print_byte_register(PSTR("RX_ADDR_P2-5"), nRF24L01::RX_ADDR_P2, 4);
- print_address_register(PSTR("TX_ADDR\t"), nRF24L01::TX_ADDR);
-
- print_byte_register(PSTR("RX_PW_P0-6"), nRF24L01::RX_PW_P0, 6);
- print_byte_register(PSTR("EN_AA\t"), nRF24L01::EN_AA);
- print_byte_register(PSTR("EN_RXADDR"), nRF24L01::EN_RXADDR);
- print_byte_register(PSTR("RF_CH\t"), nRF24L01::RF_CH);
- print_byte_register(PSTR("RF_SETUP"), nRF24L01::RF_SETUP);
- print_byte_register(PSTR("CONFIG\t"), nRF24L01::CONFIG);
- print_byte_register(PSTR("DYNPD/FEATURE"), nRF24L01::DYNPD, 2);
-
- printf_P(PSTR("Data Rate\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_datarate_e_str_P[getDataRate()])));
- printf_P(PSTR("Model\t\t= " PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_model_e_str_P[isPVariant()])));
- printf_P(PSTR("CRC Length\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_crclength_e_str_P[getCRCLength()])));
- printf_P(PSTR("PA Power\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_pa_dbm_e_str_P[getPALevel()])));
- printf_P(PSTR("ARC\t\t= %d\r\n"), getARC());
-}
-
-void RF24::printPrettyDetails(void)
-{
-
- #if defined(RF24_LINUX)
- printf("================ SPI Configuration ================\n");
- uint8_t bus_ce = static_cast<uint8_t>(csn_pin % 10);
- uint8_t bus_numb = static_cast<uint8_t>((csn_pin - bus_ce) / 10);
- printf("CSN Pin\t\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
- printf("CE Pin\t\t\t= Custom GPIO%d\n", ce_pin);
- #endif
- printf_P(PSTR("SPI Frequency\t\t= %d Mhz\n"), static_cast<uint8_t>(spi_speed / 1000000)); //Print the SPI speed on non-Linux devices
- #if defined(RF24_LINUX)
- printf("================ NRF Configuration ================\n");
- #endif // defined(RF24_LINUX)
-
- uint8_t channel = getChannel();
- uint16_t frequency = static_cast<uint16_t>(channel + 2400);
- printf_P(PSTR("Channel\t\t\t= %u (~ %u MHz)\r\n"), channel, frequency);
- printf_P(PSTR("Model\t\t\t= " PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_model_e_str_P[isPVariant()])));
-
- printf_P(PSTR("RF Data Rate\t\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_datarate_e_str_P[getDataRate()])));
- printf_P(PSTR("RF Power Amplifier\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_pa_dbm_e_str_P[getPALevel()])));
- printf_P(PSTR("RF Low Noise Amplifier\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>((read_register(nRF24L01::RF_SETUP) & 1) * 1)])));
- printf_P(PSTR("CRC Length\t\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_crclength_e_str_P[getCRCLength()])));
- printf_P(PSTR("Address Length\t\t= %d bytes\r\n"), (read_register(nRF24L01::SETUP_AW) & 3) + 2);
- printf_P(PSTR("Static Payload Length\t= %d bytes\r\n"), getPayloadSize());
-
- uint8_t setupRetry = read_register(nRF24L01::SETUP_RETR);
- printf_P(PSTR("Auto Retry Delay\t= %d microseconds\r\n"), (setupRetry >> nRF24L01::ARD) * 250 + 250);
- printf_P(PSTR("Auto Retry Attempts\t= %d maximum\r\n"), setupRetry & 0x0F);
-
- uint8_t observeTx = read_register(nRF24L01::OBSERVE_TX);
- printf_P(PSTR("Packets lost on\n current channel\t= %d\r\n"), observeTx >> 4);
- printf_P(PSTR("Retry attempts made for\n last transmission\t= %d\r\n"), observeTx & 0x0F);
-
- uint8_t features = read_register(nRF24L01::FEATURE);
- printf_P(PSTR("Multicast\t\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>(static_cast<bool>(features & _BV(nRF24L01::EN_DYN_ACK)) * 2)])));
- printf_P(PSTR("Custom ACK Payload\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>(static_cast<bool>(features & _BV(nRF24L01::EN_ACK_PAY)) * 1)])));
-
- uint8_t dynPl = read_register(nRF24L01::DYNPD);
- printf_P(PSTR("Dynamic Payloads\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>((dynPl && (features & _BV(nRF24L01::EN_DPL))) * 1)])));
-
- uint8_t autoAck = read_register(nRF24L01::EN_AA);
- if (autoAck == 0x3F || autoAck == 0) {
- // all pipes have the same configuration about auto-ack feature
- printf_P(PSTR("Auto Acknowledgment\t" PRIPSTR
- "\r\n"),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>(static_cast<bool>(autoAck) * 1)])));
- }
- else {
- // representation per pipe
- printf_P(PSTR("Auto Acknowledgment\t= 0b%c%c%c%c%c%c\r\n"),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P5)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P4)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P3)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P2)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P1)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P0)) + 48));
- }
-
- config_reg = read_register(nRF24L01::CONFIG);
- printf_P(PSTR("Primary Mode\t\t= %cX\r\n"), config_reg & _BV(nRF24L01::PRIM_RX) ? 'R' : 'T');
- print_address_register(PSTR("TX address\t"), nRF24L01::TX_ADDR);
-
- uint8_t openPipes = read_register(nRF24L01::EN_RXADDR);
- for (uint8_t i = 0; i < 6; ++i) {
- bool isOpen = openPipes & _BV(i);
- printf_P(PSTR("pipe %u (" PRIPSTR
- ") bound"),
- i, (char*)(pgm_read_ptr(&rf24_feature_e_str_P[isOpen + 3])));
- if (i < 2) {
- print_address_register(PSTR(""), static_cast<uint8_t>(nRF24L01::RX_ADDR_P0 + i));
- }
- else {
- print_byte_register(PSTR(""), static_cast<uint8_t>(nRF24L01::RX_ADDR_P0 + i));
- }
- }
-}
-
-/****************************************************************************/
-
-uint16_t RF24::sprintfPrettyDetails(char* debugging_information)
-{
- const char* format_string = PSTR(
- "================ SPI Configuration ================\n"
- "CSN Pin\t\t\t= %d\n"
- "CE Pin\t\t\t= %d\n"
- "SPI Frequency\t\t= %d Mhz\n"
- "================ NRF Configuration ================\n"
- "Channel\t\t\t= %u (~ %u MHz)\n"
- "RF Data Rate\t\t" PRIPSTR "\n"
- "RF Power Amplifier\t" PRIPSTR "\n"
- "RF Low Noise Amplifier\t" PRIPSTR "\n"
- "CRC Length\t\t" PRIPSTR "\n"
- "Address Length\t\t= %d bytes\n"
- "Static Payload Length\t= %d bytes\n"
- "Auto Retry Delay\t= %d microseconds\n"
- "Auto Retry Attempts\t= %d maximum\n"
- "Packets lost on\n current channel\t= %d\r\n"
- "Retry attempts made for\n last transmission\t= %d\r\n"
- "Multicast\t\t" PRIPSTR "\n"
- "Custom ACK Payload\t" PRIPSTR "\n"
- "Dynamic Payloads\t" PRIPSTR "\n"
- "Auto Acknowledgment\t");
- const char* format_str2 = PSTR("\nPrimary Mode\t\t= %cX\nTX address\t\t= 0x");
- const char* format_str3 = PSTR("\nPipe %d (" PRIPSTR ") bound\t= 0x");
-
- uint16_t offset = sprintf_P(
- debugging_information, format_string, csn_pin, ce_pin,
- static_cast<uint8_t>(spi_speed / 1000000), getChannel(),
- static_cast<uint16_t>(getChannel() + 2400),
- (char*)(pgm_read_ptr(&rf24_datarate_e_str_P[getDataRate()])),
- (char*)(pgm_read_ptr(&rf24_pa_dbm_e_str_P[getPALevel()])),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>((read_register(nRF24L01::RF_SETUP) & 1) * 1)])),
- (char*)(pgm_read_ptr(&rf24_crclength_e_str_P[getCRCLength()])),
- ((read_register(nRF24L01::SETUP_AW) & 3) + 2), getPayloadSize(),
- ((read_register(nRF24L01::SETUP_RETR) >> nRF24L01::ARD) * 250 + 250),
- (read_register(nRF24L01::SETUP_RETR) & 0x0F), (read_register(nRF24L01::OBSERVE_TX) >> 4),
- (read_register(nRF24L01::OBSERVE_TX) & 0x0F),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>(static_cast<bool>(read_register(nRF24L01::FEATURE) & _BV(nRF24L01::EN_DYN_ACK)) * 2)])),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>(static_cast<bool>(read_register(nRF24L01::FEATURE) & _BV(nRF24L01::EN_ACK_PAY)) * 1)])),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>((read_register(nRF24L01::DYNPD) && (read_register(nRF24L01::FEATURE) & _BV(nRF24L01::EN_DPL))) * 1)])));
- uint8_t autoAck = read_register(nRF24L01::EN_AA);
- if (autoAck == 0x3F || autoAck == 0) {
- // all pipes have the same configuration about auto-ack feature
- offset += sprintf_P(
- debugging_information + offset, PSTR("" PRIPSTR ""),
- (char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<uint8_t>(static_cast<bool>(autoAck) * 1)])));
- }
- else {
- // representation per pipe
- offset += sprintf_P(
- debugging_information + offset, PSTR("= 0b%c%c%c%c%c%c"),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P5)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P4)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P3)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P2)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P1)) + 48),
- static_cast<char>(static_cast<bool>(autoAck & _BV(nRF24L01::ENAA_P0)) + 48));
- }
- offset += sprintf_P(
- debugging_information + offset, format_str2,
- (read_register(nRF24L01::CONFIG) & _BV(nRF24L01::PRIM_RX) ? 'R' : 'T'));
- offset += sprintf_address_register(debugging_information + offset, nRF24L01::TX_ADDR);
- uint8_t openPipes = read_register(nRF24L01::EN_RXADDR);
- for (uint8_t i = 0; i < 6; ++i) {
- offset += sprintf_P(
- debugging_information + offset, format_str3,
- i, ((char*)(pgm_read_ptr(&rf24_feature_e_str_P[static_cast<bool>(openPipes & _BV(i)) + 3]))));
- if (i < 2) {
- offset += sprintf_address_register(
- debugging_information + offset, static_cast<uint8_t>(nRF24L01::RX_ADDR_P0 + i));
- }
- else {
- offset += sprintf_P(
- debugging_information + offset, PSTR("%02X"),
- read_register(static_cast<uint8_t>(nRF24L01::RX_ADDR_P0 + i)));
- }
- }
- return offset;
-}
-
-/****************************************************************************/
-
-void RF24::encodeRadioDetails(uint8_t* encoded_details)
-{
- uint8_t end = nRF24L01::FEATURE + 1;
- for (uint8_t i = nRF24L01::CONFIG; i < end; ++i) {
- if (i == nRF24L01::RX_ADDR_P0 || i == nRF24L01::RX_ADDR_P1 || i == nRF24L01::TX_ADDR) {
- // get 40-bit registers
- read_register(i, encoded_details, 5);
- encoded_details += 5;
- }
- else if (i != 0x18 && i != 0x19 && i != 0x1a && i != 0x1b) { // skip undocumented registers
- // get single byte registers
- *encoded_details++ = read_register(i);
- }
- }
- *encoded_details++ = ce_pin >> 4;
- *encoded_details++ = ce_pin & 0xFF;
- *encoded_details++ = csn_pin >> 4;
- *encoded_details++ = csn_pin & 0xFF;
- *encoded_details = static_cast<uint8_t>((spi_speed / 1000000) | _BV(_is_p_variant * 4));
-}
-#endif // !defined(MINIMAL)
-
-/****************************************************************************/
-#if defined(RF24_SPI_PTR) || defined(DOXYGEN_FORCED)
-// does not apply to RF24_LINUX
-
-bool RF24::begin(_SPI* spiBus)
-{
- _spi = spiBus;
- return _init_pins() && _init_radio();
-}
-
-/****************************************************************************/
-
-bool RF24::begin(_SPI* spiBus, rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin)
-{
- ce_pin = _cepin;
- csn_pin = _cspin;
- return begin(spiBus);
-}
-
-#endif // defined (RF24_SPI_PTR) || defined (DOXYGEN_FORCED)
-
-/****************************************************************************/
-
-bool RF24::begin(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin)
-{
- ce_pin = _cepin;
- csn_pin = _cspin;
- return begin();
-}
-
-/****************************************************************************/
-
-bool RF24::begin(void)
-{
-#if defined(RF24_LINUX)
- #if defined(RF24_RPi)
- switch (csn_pin) { // Ensure valid hardware CS pin
- case 0: break;
- case 1: break;
- // Allow BCM2835 enums for RPi
- case 8: csn_pin = 0; break;
- case 7: csn_pin = 1; break;
- case 18: csn_pin = 10; break; // to make it work on SPI1
- case 17: csn_pin = 11; break;
- case 16: csn_pin = 12; break;
- default: csn_pin = 0; break;
- }
- #endif // RF24_RPi
-
- _SPI.begin(csn_pin, spi_speed);
-
-#elif defined(XMEGA_D3)
- _spi->begin(csn_pin);
-
-#elif defined(RF24_RP2)
- _spi = new SPI();
- _spi->begin(PICO_DEFAULT_SPI ? spi1 : spi0);
-
-#else // using an Arduino platform || defined (LITTLEWIRE)
-
- #if defined(RF24_SPI_PTR)
- _spi->begin();
- #else // !defined(RF24_SPI_PTR)
- _SPI.begin();
- #endif // !defined(RF24_SPI_PTR)
-
-#endif // !defined(XMEGA_D3) && !defined(RF24_LINUX)
-
- return _init_pins() && _init_radio();
-}
-
-/****************************************************************************/
-
-bool RF24::_init_pins()
-{
- if (!isValid()) {
- // didn't specify the CSN & CE pins to c'tor nor begin()
- return false;
- }
-
-#if defined(RF24_LINUX)
-
- pinMode(ce_pin, OUTPUT);
- ce(LOW);
- delay(100);
-
-#elif defined(LITTLEWIRE)
- pinMode(csn_pin, OUTPUT);
- csn(HIGH);
-
-#elif defined(XMEGA_D3)
- if (ce_pin != csn_pin) {
- pinMode(ce_pin, OUTPUT);
- };
- ce(LOW);
- csn(HIGH);
- delay(200);
-
-#else // using an Arduino platform
-
- // Initialize pins
- if (ce_pin != csn_pin) {
- pinMode(ce_pin, OUTPUT);
- pinMode(csn_pin, OUTPUT);
- }
-
- ce(LOW);
- csn(HIGH);
-
- #if defined(__ARDUINO_X86__)
- delay(100);
- #endif
-#endif // !defined(XMEGA_D3) && !defined(LITTLEWIRE) && !defined(RF24_LINUX)
-
- return true; // assuming pins are connected properly
-}
-
-/****************************************************************************/
-
-bool RF24::_init_radio()
-{
- // Must allow the radio time to settle else configuration bits will not necessarily stick.
- // This is actually only required following power up but some settling time also appears to
- // be required after resets too. For full coverage, we'll always assume the worst.
- // Enabling 16b CRC is by far the most obvious case if the wrong timing is used - or skipped.
- // Technically we require 4.5ms + 14us as a worst case. We'll just call it 5ms for good measure.
- // WARNING: Delay is based on P-variant whereby non-P *may* require different timing.
- delay(5);
-
- // Set 1500uS (minimum for 32B payload in ESB@250KBPS) timeouts, to make testing a little easier
- // WARNING: If this is ever lowered, either 250KBS mode with AA is broken or maximum packet
- // sizes must never be used. See datasheet for a more complete explanation.
- setRetries(5, 15);
-
- // Then set the data rate to the slowest (and most reliable) speed supported by all hardware.
- setDataRate(RF24_1MBPS);
-
- // detect if is a plus variant & use old toggle features command accordingly
- uint8_t before_toggle = read_register(nRF24L01::FEATURE);
- toggle_features();
- uint8_t after_toggle = read_register(nRF24L01::FEATURE);
- _is_p_variant = before_toggle == after_toggle;
- if (after_toggle) {
- if (_is_p_variant) {
- // module did not experience power-on-reset (#401)
- toggle_features();
- }
- // allow use of multicast parameter and dynamic payloads by default
- write_register(nRF24L01::FEATURE, 0);
- }
- ack_payloads_enabled = false; // ack payloads disabled by default
- write_register(nRF24L01::DYNPD, 0); // disable dynamic payloads by default (for all pipes)
- dynamic_payloads_enabled = false;
- write_register(nRF24L01::EN_AA, 0x3F); // enable auto-ack on all pipes
- write_register(nRF24L01::EN_RXADDR, 3); // only open RX pipes 0 & 1
- setPayloadSize(32); // set static payload size to 32 (max) bytes by default
- setAddressWidth(5); // set default address length to (max) 5 bytes
-
- // Set up default configuration. Callers can always change it later.
- // This channel should be universally safe and not bleed over into adjacent
- // spectrum.
- setChannel(76);
-
- // Reset current status
- // Notice reset and flush is the last thing we do
- write_register(nRF24L01::STATUS, RF24_IRQ_ALL);
-
- // Flush buffers
- flush_rx();
- flush_tx();
-
- // Clear CONFIG register:
- // Reflect NO IRQ events on IRQ pin
- // Enable PTX
- // Power Up
- // 16-bit CRC (CRC required by auto-ack)
- // Do not write CE high so radio will remain in standby I mode
- // PTX should use only 22uA of power
- write_register(nRF24L01::CONFIG, (_BV(nRF24L01::EN_CRC) | _BV(nRF24L01::CRCO) | _BV(nRF24L01::MASK_RX_DR) | _BV(nRF24L01::MASK_TX_DS) | _BV(nRF24L01::MASK_MAX_RT)));
- config_reg = read_register(nRF24L01::CONFIG);
-
- powerUp();
-
- // if config is not set correctly then there was a bad response from module
- return config_reg == (_BV(nRF24L01::EN_CRC) | _BV(nRF24L01::CRCO) | _BV(nRF24L01::PWR_UP) | _BV(nRF24L01::MASK_RX_DR) | _BV(nRF24L01::MASK_TX_DS) | _BV(nRF24L01::MASK_MAX_RT)) ? true : false;
-}
-
-/****************************************************************************/
-
-bool RF24::isChipConnected()
-{
- return read_register(nRF24L01::SETUP_AW) == (addr_width - static_cast<uint8_t>(2));
-}
-
-/****************************************************************************/
-
-bool RF24::isValid()
-{
- return ce_pin != RF24_PIN_INVALID && csn_pin != RF24_PIN_INVALID;
-}
-
-/****************************************************************************/
-
-void RF24::startListening(void)
-{
-#if !defined(RF24_TINY) && !defined(LITTLEWIRE)
- powerUp();
-#endif
- config_reg |= _BV(nRF24L01::PRIM_RX);
- write_register(nRF24L01::CONFIG, config_reg);
- write_register(nRF24L01::STATUS, RF24_IRQ_ALL);
- ce(HIGH);
-
- // Restore the pipe0 address, if exists
- if (_is_p0_rx) {
- write_register(nRF24L01::RX_ADDR_P0, pipe0_reading_address, addr_width);
- }
- else {
- closeReadingPipe(0);
- }
-}
-
-/****************************************************************************/
-
-static const PROGMEM uint8_t child_pipe_enable[] = {nRF24L01::ERX_P0, nRF24L01::ERX_P1, nRF24L01::ERX_P2,
- nRF24L01::ERX_P3, nRF24L01::ERX_P4, nRF24L01::ERX_P5};
-
-void RF24::stopListening(void)
-{
- ce(LOW);
-
- //delayMicroseconds(100);
- delayMicroseconds(static_cast<int>(txDelay));
- if (ack_payloads_enabled) {
- flush_tx();
- }
-
- config_reg = static_cast<uint8_t>(config_reg & ~_BV(nRF24L01::PRIM_RX));
- write_register(nRF24L01::CONFIG, config_reg);
-
-#if defined(RF24_TINY) || defined(LITTLEWIRE)
- // for 3 pins solution TX mode is only left with additional powerDown/powerUp cycle
- if (ce_pin == csn_pin) {
- powerDown();
- powerUp();
- }
-#endif
- write_register(nRF24L01::RX_ADDR_P0, pipe0_writing_address, addr_width);
- write_register(nRF24L01::EN_RXADDR, static_cast<uint8_t>(read_register(nRF24L01::EN_RXADDR) | _BV(pgm_read_byte(&child_pipe_enable[0])))); // Enable RX on pipe0
-}
-
-/****************************************************************************/
-
-void RF24::stopListening(const uint64_t txAddress)
-{
- memcpy(pipe0_writing_address, &txAddress, addr_width);
- stopListening();
- write_register(nRF24L01::TX_ADDR, pipe0_writing_address, addr_width);
-}
-
-/****************************************************************************/
-
-void RF24::stopListening(const uint8_t* txAddress)
-{
- memcpy(pipe0_writing_address, txAddress, addr_width);
- stopListening();
- write_register(nRF24L01::TX_ADDR, pipe0_writing_address, addr_width);
-}
-
-/****************************************************************************/
-
-void RF24::powerDown(void)
-{
- ce(LOW); // Guarantee CE is low on powerDown
- config_reg = static_cast<uint8_t>(config_reg & ~_BV(nRF24L01::PWR_UP));
- write_register(nRF24L01::CONFIG, config_reg);
-}
-
-/****************************************************************************/
-
-//Power up now. Radio will not power down unless instructed by MCU for config changes etc.
-void RF24::powerUp(void)
-{
- // if not powered up then power up and wait for the radio to initialize
- if (!(config_reg & _BV(nRF24L01::PWR_UP))) {
- config_reg |= _BV(nRF24L01::PWR_UP);
- write_register(nRF24L01::CONFIG, config_reg);
-
- // For nRF24L01+ to go from power down mode to TX or RX mode it must first pass through stand-by mode.
- // There must be a delay of Tpd2stby (see Table 16.) after the nRF24L01+ leaves power down mode before
- // the CEis set high. - Tpd2stby can be up to 5ms per the 1.0 datasheet
- delayMicroseconds(RF24_POWERUP_DELAY);
- }
-}
-
-/******************************************************************/
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
-
-void RF24::errNotify()
-{
- #if defined(RF24_DEBUG) || defined(RF24_LINUX)
- printf_P(PSTR("RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.\r\n"));
- #endif
- #if defined(FAILURE_HANDLING)
- failureDetected = 1;
- #else
- delay(5000);
- #endif
-}
-
-/******************************************************************/
-
-int8_t RF24::errHandler(bool* doRecovery)
-{
-
- //Wait until complete or failed
- uint32_t timer = millis();
-
- while (!(update() & (RF24_TX_DS | RF24_TX_DF))) {
- if (millis() - timer > 95) {
- #if defined(FAILURE_HANDLING)
- flush_rx();
- flush_tx();
- if (doRecovery) {
- *doRecovery = false;
- failureRecoveryAttempts++;
- ce(LOW);
- return -1;
- }
- else {
- #endif
- errNotify();
- #if defined(FAILURE_HANDLING)
- }
- return 0;
- #else
- delay(100);
- #endif
- }
- }
- return 0;
-}
-
-/******************************************************************/
-
-void RF24::errHandler()
-{
-
- #if defined(FAILURE_HANDLING)
- flush_tx();
- flush_rx();
- if (!failureFlushed) {
- failureFlushed = true;
- failureRecoveryAttempts++;
- }
- else {
- #endif
- errNotify();
- #if defined(FAILURE_HANDLING)
- failureFlushed = false;
- }
- ce(LOW);
- #endif
-}
-
-#endif
-
-/******************************************************************/
-
-//Similar to the previous write, clears the interrupt flags
-bool RF24::write(const void* buf, uint8_t len, const bool multicast)
-{
-
- //Start Writing
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- bool doRecovery = true;
- do {
-#endif
- startFastWrite(buf, len, multicast);
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- } while (errHandler(&doRecovery) < 0);
-#endif
-
- ce(LOW);
-
- write_register(nRF24L01::STATUS, RF24_IRQ_ALL);
-
- //Max retries exceeded
- if (status & RF24_TX_DF) {
- flush_tx(); // Only going to be 1 packet in the FIFO at a time using this method, so just flush
- return 0;
- }
- //TX OK 1 or 0
- return 1;
-}
-
-/****************************************************************************/
-
-bool RF24::write(const void* buf, uint8_t len)
-{
- return write(buf, len, 0);
-}
-
-/****************************************************************************/
-
-//For general use, the interrupt flags are not important to clear
-bool RF24::writeBlocking(const void* buf, uint8_t len, uint32_t timeout)
-{
- //Block until the FIFO is NOT full.
- //Keep track of the MAX retries and set auto-retry if seeing failures
- //This way the FIFO will fill up and allow blocking until packets go through
- //The radio will auto-clear everything in the FIFO as long as CE remains high
-#if defined(FAILURE_HANDLING)
- bool timeoutInvoked = false;
-#endif
-
- uint32_t timer = millis(); // Get the time that the payload transmission started
-
- while (update() & _BV(nRF24L01::TX_FULL)) { // Blocking only if FIFO is full. This will loop and block until TX is successful or timeout
-
- if (status & RF24_TX_DF) { // If MAX Retries have been reached
- reUseTX(); // Set re-transmit and clear the MAX_RT interrupt flag
- if (millis() - timer > timeout) {
-#if defined(FAILURE_HANDLING)
- failureFlushed = false;
-#endif
- return 0; // If this payload has exceeded the user-defined timeout, exit and return 0
- }
- }
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- if (millis() - timer > (timeout + 95)) {
- errHandler();
- #if defined(FAILURE_HANDLING)
- timeoutInvoked = true;
- if (!failureFlushed) {
- #endif
- return 0;
- #if defined(FAILURE_HANDLING)
- }
- #endif
- }
-#endif
- }
-
- //Start Writing
- startFastWrite(buf, len, 0); // Write the payload if a buffer is clear
-#if defined(FAILURE_HANDLING)
- if (!timeoutInvoked) {
- failureFlushed = false;
- }
-#endif
- return 1; // Return 1 to indicate successful transmission
-}
-
-/****************************************************************************/
-
-void RF24::reUseTX()
-{
- ce(LOW);
- write_register(nRF24L01::STATUS, RF24_TX_DF); //Clear max retry flag
- read_register(nRF24L01::REUSE_TX_PL, (uint8_t*)nullptr, 0);
- IF_RF24_DEBUG(printf_P("[Reusing payload in TX FIFO]"););
- ce(HIGH); //Re-Transfer packet
-}
-
-/****************************************************************************/
-
-bool RF24::writeFast(const void* buf, uint8_t len, const bool multicast)
-{
- //Block until the FIFO is NOT full.
- //Keep track of the MAX retries and set auto-retry if seeing failures
- //Return 0 so the user can control the retries and set a timer or failure counter if required
- //The radio will auto-clear everything in the FIFO as long as CE remains high
-
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- uint32_t timer = millis();
- bool timeoutInvoked = false;
-#endif
-
- //Blocking only if FIFO is full. This will loop and block until TX is successful or fail
- while (update() & _BV(nRF24L01::TX_FULL)) {
- if (status & RF24_TX_DF) {
-#if defined(FAILURE_HANDLING)
- failureFlushed = false;
-#endif
- return 0; //Return 0. The previous payload has not been retransmitted
- // From the user perspective, if you get a 0, call txStandBy()
- }
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- if (millis() - timer > 95) {
- timeoutInvoked = true;
- errHandler();
- #if defined(FAILURE_HANDLING)
- if (!failureFlushed) {
- #endif
- return 0;
- #if defined(FAILURE_HANDLING)
- }
- #endif
- }
-#endif
- }
- startFastWrite(buf, len, multicast); // Start Writing
-#if defined(FAILURE_HANDLING)
- if (!timeoutInvoked) {
- failureFlushed = false;
- }
-#endif
- return 1;
-}
-
-bool RF24::writeFast(const void* buf, uint8_t len)
-{
- return writeFast(buf, len, 0);
-}
-
-/****************************************************************************/
-
-//Per the documentation, we want to set PTX Mode when not listening. Then all we do is write data and set CE high
-//In this mode, if we can keep the FIFO buffers loaded, packets will transmit immediately (no 130us delay)
-//Otherwise we enter Standby-II mode, which is still faster than standby mode
-//Also, we remove the need to keep writing the config register over and over and delaying for 150 us each time if sending a stream of data
-
-void RF24::startFastWrite(const void* buf, uint8_t len, const bool multicast, bool startTx)
-{ //TMRh20
-
- write_payload(buf, len, multicast ? nRF24L01::W_TX_PAYLOAD_NO_ACK : nRF24L01::W_TX_PAYLOAD);
- if (startTx) {
- ce(HIGH);
- }
-}
-
-/****************************************************************************/
-
-//Added the original startWrite back in so users can still use interrupts, ack payloads, etc
-//Allows the library to pass all tests
-bool RF24::startWrite(const void* buf, uint8_t len, const bool multicast)
-{
-
- // Send the payload
- write_payload(buf, len, multicast ? nRF24L01::W_TX_PAYLOAD_NO_ACK : nRF24L01::W_TX_PAYLOAD);
- ce(HIGH);
-#if !defined(F_CPU) || F_CPU > 20000000
- delayMicroseconds(10);
-#endif
-#ifdef ARDUINO_ARCH_STM32
- if (F_CPU > 20000000) {
- delayMicroseconds(10);
- }
-#endif
- ce(LOW);
- return !(status & _BV(nRF24L01::TX_FULL));
-}
-
-/****************************************************************************/
-
-bool RF24::rxFifoFull()
-{
- return read_register(nRF24L01::FIFO_STATUS) & _BV(nRF24L01::RX_FULL);
-}
-
-/****************************************************************************/
-
-rf24_fifo_state_e RF24::isFifo(bool about_tx)
-{
- uint8_t state = (read_register(nRF24L01::FIFO_STATUS) >> (4 * about_tx)) & 3;
- return static_cast<rf24_fifo_state_e>(state);
-}
-
-/****************************************************************************/
-
-bool RF24::isFifo(bool about_tx, bool check_empty)
-{
- return static_cast<bool>(static_cast<uint8_t>(isFifo(about_tx)) & _BV(!check_empty));
-}
-
-/****************************************************************************/
-
-bool RF24::txStandBy()
-{
-
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- uint32_t timeout = millis();
-#endif
- while (!(read_register(nRF24L01::FIFO_STATUS) & _BV(nRF24L01::TX_EMPTY))) {
- if (status & RF24_TX_DF) {
- write_register(nRF24L01::STATUS, RF24_TX_DF);
- ce(LOW);
- flush_tx(); //Non blocking, flush the data
-#if defined(FAILURE_HANDLING)
- failureFlushed = false;
-#endif
- return 0;
- }
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- if (millis() - timeout > 95) {
- errHandler();
- return 0;
- }
-#endif
- }
-
- ce(LOW); //Set STANDBY-I mode
-#if defined(FAILURE_HANDLING)
- failureFlushed = false;
-#endif
- return 1;
-}
-
-/****************************************************************************/
-
-bool RF24::txStandBy(uint32_t timeout, bool startTx)
-{
-
- if (startTx) {
- stopListening();
- ce(HIGH);
- }
- uint32_t start = millis();
-
- while (!(read_register(nRF24L01::FIFO_STATUS) & _BV(nRF24L01::TX_EMPTY))) {
- if (status & RF24_TX_DF) {
- write_register(nRF24L01::STATUS, RF24_TX_DF);
- ce(LOW); // Set re-transmit
- ce(HIGH);
- if (millis() - start >= timeout) {
- ce(LOW);
- flush_tx();
-#if defined(FAILURE_HANDLING)
- failureFlushed = false;
-#endif
- return 0;
- }
- }
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
- if (millis() - start > timeout + 95) {
- errHandler();
- return 0;
- }
-#endif
- }
-
- ce(LOW); //Set STANDBY-I mode
-#if defined(FAILURE_HANDLING)
- failureFlushed = false;
-#endif
- return 1;
-}
-
-/****************************************************************************/
-
-void RF24::maskIRQ(bool tx, bool fail, bool rx)
-{
- /* clear the interrupt flags */
- config_reg = static_cast<uint8_t>(config_reg & ~(1 << nRF24L01::MASK_MAX_RT | 1 << nRF24L01::MASK_TX_DS | 1 << nRF24L01::MASK_RX_DR));
- /* set the specified interrupt flags */
- config_reg = static_cast<uint8_t>(config_reg | fail << nRF24L01::MASK_MAX_RT | tx << nRF24L01::MASK_TX_DS | rx << nRF24L01::MASK_RX_DR);
- write_register(nRF24L01::CONFIG, config_reg);
-}
-
-/****************************************************************************/
-
-uint8_t RF24::getDynamicPayloadSize(void)
-{
- uint8_t result = read_register(nRF24L01::R_RX_PL_WID);
-
- if (result > 32 || !result) {
- flush_rx();
- return 0;
- }
- return result;
-}
-
-/****************************************************************************/
-
-bool RF24::available(void)
-{
- return (read_register(nRF24L01::FIFO_STATUS) & 1) == 0;
-}
-
-/****************************************************************************/
-
-bool RF24::available(uint8_t* pipe_num)
-{
- if (available()) { // if RX FIFO is not empty
- *pipe_num = (update() >> nRF24L01::RX_P_NO) & 0x07;
- return 1;
- }
- return 0;
-}
-
-/****************************************************************************/
-
-void RF24::read(void* buf, uint8_t len)
-{
-
- // Fetch the payload
- read_payload(buf, len);
-
- //Clear the only applicable interrupt flags
- write_register(nRF24L01::STATUS, RF24_RX_DR);
-}
-
-/****************************************************************************/
-
-void RF24::whatHappened(bool& tx_ok, bool& tx_fail, bool& rx_ready)
-{
- // Read the status & reset the status in one easy call
- // Or is that such a good idea?
- write_register(nRF24L01::STATUS, RF24_IRQ_ALL);
-
- // Report to the user what happened
- tx_ok = status & RF24_TX_DS;
- tx_fail = status & RF24_TX_DF;
- rx_ready = status & RF24_RX_DR;
-}
-
-/****************************************************************************/
-
-uint8_t RF24::clearStatusFlags(uint8_t flags)
-{
- write_register(nRF24L01::STATUS, flags & RF24_IRQ_ALL);
- return status;
-}
-
-/****************************************************************************/
-
-void RF24::setStatusFlags(uint8_t flags)
-{
- // flip the `flags` to translate from "human understanding"
- config_reg = (config_reg & ~RF24_IRQ_ALL) | (~flags & RF24_IRQ_ALL);
- write_register(nRF24L01::CONFIG, config_reg);
-}
-
-/****************************************************************************/
-
-uint8_t RF24::getStatusFlags()
-{
- return status;
-}
-
-/****************************************************************************/
-
-uint8_t RF24::update()
-{
- read_register(nRF24L01::NOP, (uint8_t*)nullptr, 0);
- return status;
-}
-
-/****************************************************************************/
-
-void RF24::openWritingPipe(uint64_t value)
-{
- // Note that AVR 8-bit uC's store this LSB first, and the NRF24L01(+)
- // expects it LSB first too, so we're good.
-
- write_register(nRF24L01::RX_ADDR_P0, reinterpret_cast<uint8_t*>(&value), addr_width);
- write_register(nRF24L01::TX_ADDR, reinterpret_cast<uint8_t*>(&value), addr_width);
- memcpy(pipe0_writing_address, &value, addr_width);
-}
-
-/****************************************************************************/
-
-void RF24::openWritingPipe(const uint8_t* address)
-{
- // Note that AVR 8-bit uC's store this LSB first, and the NRF24L01(+)
- // expects it LSB first too, so we're good.
- write_register(nRF24L01::RX_ADDR_P0, address, addr_width);
- write_register(nRF24L01::TX_ADDR, address, addr_width);
- memcpy(pipe0_writing_address, address, addr_width);
-}
-
-/****************************************************************************/
-
-static const PROGMEM uint8_t child_pipe[] = {nRF24L01::RX_ADDR_P0, nRF24L01::RX_ADDR_P1, nRF24L01::RX_ADDR_P2,
- nRF24L01::RX_ADDR_P3, nRF24L01::RX_ADDR_P4, nRF24L01::RX_ADDR_P5};
-
-void RF24::openReadingPipe(uint8_t child, uint64_t address)
-{
- // If this is pipe 0, cache the address. This is needed because
- // openWritingPipe() will overwrite the pipe 0 address, so
- // startListening() will have to restore it.
- if (child == 0) {
- memcpy(pipe0_reading_address, &address, addr_width);
- _is_p0_rx = true;
- }
-
- if (child <= 5) {
- // For pipes 2-5, only write the LSB
- if (child > 1) {
- write_register(pgm_read_byte(&child_pipe[child]), reinterpret_cast<const uint8_t*>(&address), 1);
- }
- // avoid overwriting the TX address on pipe 0 while still in TX mode.
- // NOTE, the cached RX address on pipe 0 is written when startListening() is called.
- else if (static_cast<bool>(config_reg & _BV(nRF24L01::PRIM_RX)) || child != 0) {
- write_register(pgm_read_byte(&child_pipe[child]), reinterpret_cast<const uint8_t*>(&address), addr_width);
- }
-
- // Note it would be more efficient to set all of the bits for all open
- // pipes at once. However, I thought it would make the calling code
- // more simple to do it this way.
- write_register(nRF24L01::EN_RXADDR, static_cast<uint8_t>(read_register(nRF24L01::EN_RXADDR) | _BV(pgm_read_byte(&child_pipe_enable[child]))));
- }
-}
-
-/****************************************************************************/
-
-void RF24::setAddressWidth(uint8_t a_width)
-{
- a_width = static_cast<uint8_t>(a_width - 2);
- if (a_width) {
- write_register(nRF24L01::SETUP_AW, static_cast<uint8_t>(a_width % 4));
- addr_width = static_cast<uint8_t>((a_width % 4) + 2);
- }
- else {
- write_register(nRF24L01::SETUP_AW, static_cast<uint8_t>(0));
- addr_width = static_cast<uint8_t>(2);
- }
-}
-
-/****************************************************************************/
-
-void RF24::openReadingPipe(uint8_t child, const uint8_t* address)
-{
- // If this is pipe 0, cache the address. This is needed because
- // openWritingPipe() will overwrite the pipe 0 address, so
- // startListening() will have to restore it.
- if (child == 0) {
- memcpy(pipe0_reading_address, address, addr_width);
- _is_p0_rx = true;
- }
- if (child <= 5) {
- // For pipes 2-5, only write the LSB
- if (child > 1) {
- write_register(pgm_read_byte(&child_pipe[child]), address, 1);
- }
- // avoid overwriting the TX address on pipe 0 while still in TX mode.
- // NOTE, the cached RX address on pipe 0 is written when startListening() is called.
- else if (static_cast<bool>(config_reg & _BV(nRF24L01::PRIM_RX)) || child != 0) {
- write_register(pgm_read_byte(&child_pipe[child]), address, addr_width);
- }
-
- // Note it would be more efficient to set all of the bits for all open
- // pipes at once. However, I thought it would make the calling code
- // more simple to do it this way.
- write_register(nRF24L01::EN_RXADDR, static_cast<uint8_t>(read_register(nRF24L01::EN_RXADDR) | _BV(pgm_read_byte(&child_pipe_enable[child]))));
- }
-}
-
-/****************************************************************************/
-
-void RF24::closeReadingPipe(uint8_t pipe)
-{
- write_register(nRF24L01::EN_RXADDR, static_cast<uint8_t>(read_register(nRF24L01::EN_RXADDR) & ~_BV(pgm_read_byte(&child_pipe_enable[pipe]))));
- if (!pipe) {
- // keep track of pipe 0's RX state to avoid null vs 0 in addr cache
- _is_p0_rx = false;
- }
-}
-
-/****************************************************************************/
-
-void RF24::toggle_features(void)
-{
- beginTransaction();
-#if defined(RF24_SPI_PTR)
- status = _spi->transfer(nRF24L01::ACTIVATE);
- _spi->transfer(0x73);
-#else
- status = _SPI.transfer(nRF24L01::ACTIVATE);
- _SPI.transfer(0x73);
-#endif
- endTransaction();
-}
-
-/****************************************************************************/
-
-void RF24::enableDynamicPayloads(void)
-{
- // Enable dynamic payload throughout the system
-
- //toggle_features();
- write_register(nRF24L01::FEATURE, read_register(nRF24L01::FEATURE) | _BV(nRF24L01::EN_DPL));
-
- IF_RF24_DEBUG(printf_P("FEATURE=%i\r\n", read_register(nRF24L01::FEATURE)));
-
- // Enable dynamic payload on all pipes
- //
- // Not sure the use case of only having dynamic payload on certain
- // pipes, so the library does not support it.
- write_register(nRF24L01::DYNPD, read_register(nRF24L01::DYNPD) | _BV(nRF24L01::DPL_P5) | _BV(nRF24L01::DPL_P4) | _BV(nRF24L01::DPL_P3) | _BV(nRF24L01::DPL_P2) | _BV(nRF24L01::DPL_P1) | _BV(nRF24L01::DPL_P0));
-
- dynamic_payloads_enabled = true;
-}
-
-/****************************************************************************/
-
-void RF24::disableDynamicPayloads(void)
-{
- // Disables dynamic payload throughout the system. Also disables Ack Payloads
-
- //toggle_features();
- write_register(nRF24L01::FEATURE, 0);
-
- IF_RF24_DEBUG(printf_P("FEATURE=%i\r\n", read_register(nRF24L01::FEATURE)));
-
- // Disable dynamic payload on all pipes
- //
- // Not sure the use case of only having dynamic payload on certain
- // pipes, so the library does not support it.
- write_register(nRF24L01::DYNPD, 0);
-
- dynamic_payloads_enabled = false;
- ack_payloads_enabled = false;
-}
-
-/****************************************************************************/
-
-void RF24::enableAckPayload(void)
-{
- // enable ack payloads and dynamic payload features
-
- if (!ack_payloads_enabled) {
- write_register(nRF24L01::FEATURE, read_register(nRF24L01::FEATURE) | _BV(nRF24L01::EN_ACK_PAY) | _BV(nRF24L01::EN_DPL));
-
- IF_RF24_DEBUG(printf_P("FEATURE=%i\r\n", read_register(nRF24L01::FEATURE)));
-
- // Enable dynamic payload on pipes 0 & 1
- write_register(nRF24L01::DYNPD, read_register(nRF24L01::DYNPD) | _BV(nRF24L01::DPL_P1) | _BV(nRF24L01::DPL_P0));
- dynamic_payloads_enabled = true;
- ack_payloads_enabled = true;
- }
-}
-
-/****************************************************************************/
-
-void RF24::disableAckPayload(void)
-{
- // disable ack payloads (leave dynamic payload features as is)
- if (ack_payloads_enabled) {
- write_register(nRF24L01::FEATURE, static_cast<uint8_t>(read_register(nRF24L01::FEATURE) & ~_BV(nRF24L01::EN_ACK_PAY)));
-
- IF_RF24_DEBUG(printf_P("FEATURE=%i\r\n", read_register(nRF24L01::FEATURE)));
-
- ack_payloads_enabled = false;
- }
-}
-
-/****************************************************************************/
-
-void RF24::enableDynamicAck(void)
-{
- //
- // enable dynamic ack features
- //
- //toggle_features();
- write_register(nRF24L01::FEATURE, read_register(nRF24L01::FEATURE) | _BV(nRF24L01::EN_DYN_ACK));
-
- IF_RF24_DEBUG(printf_P("FEATURE=%i\r\n", read_register(nRF24L01::FEATURE)));
-}
-
-/****************************************************************************/
-
-bool RF24::writeAckPayload(uint8_t pipe, const void* buf, uint8_t len)
-{
- if (ack_payloads_enabled) {
- const uint8_t* current = reinterpret_cast<const uint8_t*>(buf);
-
- write_register(nRF24L01::W_ACK_PAYLOAD | (pipe & 0x07), current, rf24_min(len, static_cast<uint8_t>(32)));
- return !(status & _BV(nRF24L01::TX_FULL));
- }
- return 0;
-}
-
-/****************************************************************************/
-
-bool RF24::isAckPayloadAvailable(void)
-{
- return available();
-}
-
-/****************************************************************************/
-
-bool RF24::isPVariant(void)
-{
- return _is_p_variant;
-}
-
-/****************************************************************************/
-
-void RF24::setAutoAck(bool enable)
-{
- if (enable) {
- write_register(nRF24L01::EN_AA, 0x3F);
- }
- else {
- write_register(nRF24L01::EN_AA, 0);
- // accommodate ACK payloads feature
- if (ack_payloads_enabled) {
- disableAckPayload();
- }
- }
-}
-
-/****************************************************************************/
-
-void RF24::setAutoAck(uint8_t pipe, bool enable)
-{
- if (pipe < 6) {
- uint8_t en_aa = read_register(nRF24L01::EN_AA);
- if (enable) {
- en_aa |= static_cast<uint8_t>(_BV(pipe));
- }
- else {
- en_aa = static_cast<uint8_t>(en_aa & ~_BV(pipe));
- if (ack_payloads_enabled && !pipe) {
- disableAckPayload();
- }
- }
- write_register(nRF24L01::EN_AA, en_aa);
- }
-}
-
-/****************************************************************************/
-
-bool RF24::testCarrier(void)
-{
- return (read_register(nRF24L01::CD) & 1);
-}
-
-/****************************************************************************/
-
-bool RF24::testRPD(void)
-{
- return (read_register(nRF24L01::RPD) & 1);
-}
-
-/****************************************************************************/
-
-void RF24::setPALevel(uint8_t level, bool lnaEnable)
-{
- uint8_t setup = read_register(nRF24L01::RF_SETUP) & static_cast<uint8_t>(0xF8);
- setup |= _pa_level_reg_value(level, lnaEnable);
- write_register(nRF24L01::RF_SETUP, setup);
-}
-
-/****************************************************************************/
-
-uint8_t RF24::getPALevel(void)
-{
- return (read_register(nRF24L01::RF_SETUP) & (_BV(nRF24L01::RF_PWR_LOW) | _BV(nRF24L01::RF_PWR_HIGH))) >> 1;
-}
-
-/****************************************************************************/
-
-uint8_t RF24::getARC(void)
-{
- return read_register(nRF24L01::OBSERVE_TX) & 0x0F;
-}
-
-/****************************************************************************/
-
-bool RF24::setDataRate(rf24_datarate_e speed)
-{
- bool result = false;
- uint8_t setup = read_register(nRF24L01::RF_SETUP);
-
- // HIGH and LOW '00' is 1Mbs - our default
- setup = static_cast<uint8_t>(setup & ~(_BV(nRF24L01::RF_DR_LOW) | _BV(nRF24L01::RF_DR_HIGH)));
- setup |= _data_rate_reg_value(speed);
-
- write_register(nRF24L01::RF_SETUP, setup);
-
- // Verify our result
- if (read_register(nRF24L01::RF_SETUP) == setup) {
- result = true;
- }
- return result;
-}
-
-/****************************************************************************/
-
-rf24_datarate_e RF24::getDataRate(void)
-{
- rf24_datarate_e result;
- uint8_t dr = read_register(nRF24L01::RF_SETUP) & (_BV(nRF24L01::RF_DR_LOW) | _BV(nRF24L01::RF_DR_HIGH));
-
- // switch uses RAM (evil!)
- // Order matters in our case below
- if (dr == _BV(nRF24L01::RF_DR_LOW)) {
- // '10' = 250KBPS
- result = RF24_250KBPS;
- }
- else if (dr == _BV(nRF24L01::RF_DR_HIGH)) {
- // '01' = 2MBPS
- result = RF24_2MBPS;
- }
- else {
- // '00' = 1MBPS
- result = RF24_1MBPS;
- }
- return result;
-}
-
-/****************************************************************************/
-
-void RF24::setCRCLength(rf24_crclength_e length)
-{
- config_reg = static_cast<uint8_t>(config_reg & ~(_BV(nRF24L01::CRCO) | _BV(nRF24L01::EN_CRC)));
-
- // switch uses RAM (evil!)
- if (length == RF24_CRC_DISABLED) {
- // Do nothing, we turned it off above.
- }
- else if (length == RF24_CRC_8) {
- config_reg |= _BV(nRF24L01::EN_CRC);
- }
- else {
- config_reg |= _BV(nRF24L01::EN_CRC);
- config_reg |= _BV(nRF24L01::CRCO);
- }
- write_register(nRF24L01::CONFIG, config_reg);
-}
-
-/****************************************************************************/
-
-rf24_crclength_e RF24::getCRCLength(void)
-{
- rf24_crclength_e result = RF24_CRC_DISABLED;
- uint8_t AA = read_register(nRF24L01::EN_AA);
- config_reg = read_register(nRF24L01::CONFIG);
-
- if (config_reg & _BV(nRF24L01::EN_CRC) || AA) {
- if (config_reg & _BV(nRF24L01::CRCO)) {
- result = RF24_CRC_16;
- }
- else {
- result = RF24_CRC_8;
- }
- }
-
- return result;
-}
-
-/****************************************************************************/
-
-void RF24::disableCRC(void)
-{
- config_reg = static_cast<uint8_t>(config_reg & ~_BV(nRF24L01::EN_CRC));
- write_register(nRF24L01::CONFIG, config_reg);
-}
-
-/****************************************************************************/
-void RF24::setRetries(uint8_t delay, uint8_t count)
-{
- write_register(nRF24L01::SETUP_RETR, static_cast<uint8_t>(rf24_min(15, delay) << nRF24L01::ARD | rf24_min(15, count)));
-}
-
-/****************************************************************************/
-void RF24::startConstCarrier(rf24_pa_dbm_e level, uint8_t channel)
-{
- stopListening();
- write_register(nRF24L01::RF_SETUP, read_register(nRF24L01::RF_SETUP) | _BV(nRF24L01::CONT_WAVE) | _BV(nRF24L01::PLL_LOCK));
- if (isPVariant()) {
- setAutoAck(0);
- setRetries(0, 0);
- uint8_t dummy_buf[32];
- for (uint8_t i = 0; i < 32; ++i)
- dummy_buf[i] = 0xFF;
-
- // use write_register() instead of openWritingPipe() to bypass
- // truncation of the address with the current RF24::addr_width value
- write_register(nRF24L01::TX_ADDR, reinterpret_cast<uint8_t*>(&dummy_buf), 5);
- flush_tx(); // so we can write to top level
-
- // use write_register() instead of write_payload() to bypass
- // truncation of the payload with the current RF24::payload_size value
- write_register(nRF24L01::W_TX_PAYLOAD, reinterpret_cast<const uint8_t*>(&dummy_buf), 32);
-
- disableCRC();
- }
- setPALevel(level);
- setChannel(channel);
- IF_RF24_DEBUG(printf_P(PSTR("RF_SETUP=%02x\r\n"), read_register(nRF24L01::RF_SETUP)));
- ce(HIGH);
- if (isPVariant()) {
- delay(1); // datasheet says 1 ms is ok in this instance
- reUseTX(); // CE gets toggled here
- }
-}
-
-/****************************************************************************/
-
-void RF24::stopConstCarrier()
-{
- /*
- * A note from the datasheet:
- * Do not use REUSE_TX_PL together with CONT_WAVE=1. When both these
- * registers are set the chip does not react when setting CE low. If
- * however, both registers are set PWR_UP = 0 will turn TX mode off.
- */
- powerDown(); // per datasheet recommendation (just to be safe)
- write_register(nRF24L01::RF_SETUP, static_cast<uint8_t>(read_register(nRF24L01::RF_SETUP) & ~_BV(nRF24L01::CONT_WAVE) & ~_BV(nRF24L01::PLL_LOCK)));
- ce(LOW);
- flush_tx();
- if (isPVariant()) {
- // restore the cached TX address
- write_register(nRF24L01::TX_ADDR, pipe0_writing_address, addr_width);
- }
-}
-
-/****************************************************************************/
-
-void RF24::toggleAllPipes(bool isEnabled)
-{
- write_register(nRF24L01::EN_RXADDR, static_cast<uint8_t>(isEnabled ? 0x3F : 0));
-}
-
-/****************************************************************************/
-
-uint8_t RF24::_data_rate_reg_value(rf24_datarate_e speed)
-{
-#if !defined(F_CPU) || F_CPU > 20000000
- txDelay = 280;
-#else //16Mhz Arduino
- txDelay = 85;
-#endif
- if (speed == RF24_250KBPS) {
-#if !defined(F_CPU) || F_CPU > 20000000
- txDelay = 505;
-#else //16Mhz Arduino
- txDelay = 155;
-#endif
- // Must set the RF_DR_LOW to 1; RF_DR_HIGH (used to be RF_DR) is already 0
- // Making it '10'.
- return static_cast<uint8_t>(_BV(nRF24L01::RF_DR_LOW));
- }
- else if (speed == RF24_2MBPS) {
-#if !defined(F_CPU) || F_CPU > 20000000
- txDelay = 240;
-#else // 16Mhz Arduino
- txDelay = 65;
-#endif
- // Set 2Mbs, RF_DR (RF_DR_HIGH) is set 1
- // Making it '01'
- return static_cast<uint8_t>(_BV(nRF24L01::RF_DR_HIGH));
- }
- // HIGH and LOW '00' is 1Mbs - our default
- return static_cast<uint8_t>(0);
-}
-
-/****************************************************************************/
-
-uint8_t RF24::_pa_level_reg_value(uint8_t level, bool lnaEnable)
-{
- // If invalid level, go to max PA
- // Else set level as requested
- // + lnaEnable (1 or 0) to support the SI24R1 chip extra bit
- return static_cast<uint8_t>(((level > RF24_PA_MAX ? static_cast<uint8_t>(RF24_PA_MAX) : level) << 1) + lnaEnable);
-}
-
-/****************************************************************************/
-
-void RF24::setRadiation(uint8_t level, rf24_datarate_e speed, bool lnaEnable)
-{
- uint8_t setup = _data_rate_reg_value(speed);
- setup |= _pa_level_reg_value(level, lnaEnable);
- write_register(nRF24L01::RF_SETUP, setup);
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/RF24.h b/.pio/libdeps/esp32-s3-n16r8/RF24/RF24.h
deleted file mode 100644
index f8fa473..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/RF24.h
+++ /dev/null
@@ -1,2568 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
- */
-
-/**
- * @file RF24.h
- *
- * Class declaration for RF24 and helper enums
- */
-
-#ifndef RF24_H_
-#define RF24_H_
-
-#include "RF24_config.h"
-#include "nRF24L01.h"
-
-#if defined(RF24_LINUX) || defined(LITTLEWIRE)
- #include "utility/includes.h"
-#elif defined SOFTSPI
- #include <DigitalIO.h>
-#endif
-
-/**
- * @defgroup PALevel Power Amplifier level
- * Power Amplifier level. The units dBm (decibel-milliwatts or dB<sub>mW</sub>)
- * represents a logarithmic signal loss.
- * @see
- * - RF24::setPALevel()
- * - RF24::getPALevel()
- * @{
- */
-typedef enum
-{
- /**
- * (0) represents:
- * nRF24L01 | Si24R1 with<br>lnaEnabled = 1 | Si24R1 with<br>lnaEnabled = 0
- * :-------:|:-----------------------------:|:----------------------------:
- * -18 dBm | -6 dBm | -12 dBm
- */
- RF24_PA_MIN = 0,
- /**
- * (1) represents:
- * nRF24L01 | Si24R1 with<br>lnaEnabled = 1 | Si24R1 with<br>lnaEnabled = 0
- * :-------:|:-----------------------------:|:----------------------------:
- * -12 dBm | 0 dBm | -4 dBm
- */
- RF24_PA_LOW,
- /**
- * (2) represents:
- * nRF24L01 | Si24R1 with<br>lnaEnabled = 1 | Si24R1 with<br>lnaEnabled = 0
- * :-------:|:-----------------------------:|:----------------------------:
- * -6 dBm | 3 dBm | 1 dBm
- */
- RF24_PA_HIGH,
- /**
- * (3) represents:
- * nRF24L01 | Si24R1 with<br>lnaEnabled = 1 | Si24R1 with<br>lnaEnabled = 0
- * :-------:|:-----------------------------:|:----------------------------:
- * 0 dBm | 7 dBm | 4 dBm
- */
- RF24_PA_MAX,
- /**
- * (4) This should not be used and remains for backward compatibility.
- */
- RF24_PA_ERROR
-} rf24_pa_dbm_e;
-
-/**
- * @}
- * @defgroup Datarate datarate
- * How fast data moves through the air. Units are in bits per second (bps).
- * @see
- * - RF24::setDataRate()
- * - RF24::getDataRate()
- * @{
- */
-typedef enum
-{
- /** (0) represents 1 Mbps */
- RF24_1MBPS = 0,
- /** (1) represents 2 Mbps */
- RF24_2MBPS,
- /** (2) represents 250 kbps */
- RF24_250KBPS
-} rf24_datarate_e;
-
-/**
- * @}
- * @defgroup CRCLength CRC length
- * The length of a CRC checksum that is used (if any). Cyclical Redundancy
- * Checking (CRC) is commonly used to ensure data integrity.
- * @see
- * - RF24::setCRCLength()
- * - RF24::getCRCLength()
- * - RF24::disableCRC()
- * @{
- */
-typedef enum
-{
- /** (0) represents no CRC checksum is used */
- RF24_CRC_DISABLED = 0,
- /** (1) represents CRC 8 bit checksum is used */
- RF24_CRC_8,
- /** (2) represents CRC 16 bit checksum is used */
- RF24_CRC_16
-} rf24_crclength_e;
-
-/**
- * @}
- * @defgroup fifoState FIFO state
- * The state of a single FIFO (RX or TX).
- * Remember, each FIFO has a maximum occupancy of 3 payloads.
- * @see RF24::isFifo()
- * @{
- */
-typedef enum
-{
- /// @brief The FIFO is not full nor empty, but it is occupied with 1 or 2 payloads.
- RF24_FIFO_OCCUPIED,
- /// @brief The FIFO is empty.
- RF24_FIFO_EMPTY,
- /// @brief The FIFO is full.
- RF24_FIFO_FULL,
- /// @brief Represents corruption of data over SPI (when observed).
- RF24_FIFO_INVALID,
-} rf24_fifo_state_e;
-
-/**
- * @}
- * @defgroup StatusFlags Status flags
- * @{
- */
-
-/**
- * @brief An enumeration of constants used to configure @ref StatusFlags
- */
-typedef enum
-{
- /// An alias of `0` to describe no IRQ events enabled.
- RF24_IRQ_NONE = 0,
- /// Represents an event where TX Data Failed to send.
- RF24_TX_DF = 1 << nRF24L01::MASK_MAX_RT,
- /// Represents an event where TX Data Sent successfully.
- RF24_TX_DS = 1 << nRF24L01::TX_DS,
- /// Represents an event where RX Data is Ready to `RF24::read()`.
- RF24_RX_DR = 1 << nRF24L01::RX_DR,
- /// Equivalent to `RF24_RX_DR | RF24_TX_DS | RF24_TX_DF`.
- RF24_IRQ_ALL = (1 << nRF24L01::MASK_MAX_RT) | (1 << nRF24L01::TX_DS) | (1 << nRF24L01::RX_DR),
-} rf24_irq_flags_e;
-
-/**
- * @}
- * @brief Driver class for nRF24L01(+) 2.4GHz Wireless Transceiver
- */
-class RF24
-{
-private:
-#ifdef SOFTSPI
- SoftSPI<SOFT_SPI_MISO_PIN, SOFT_SPI_MOSI_PIN, SOFT_SPI_SCK_PIN, SPI_MODE> spi;
-#elif defined(SPI_UART)
- SPIUARTClass uspi;
-#endif
-
-#if defined(RF24_LINUX) || defined(XMEGA_D3) /* XMEGA can use SPI class */
- SPI spi;
-#endif // defined (RF24_LINUX) || defined (XMEGA_D3)
-#if defined(RF24_SPI_PTR)
- _SPI* _spi;
-#endif // defined (RF24_SPI_PTR)
-
- rf24_gpio_pin_t ce_pin; /* "Chip Enable" pin, activates the RX or TX role */
- rf24_gpio_pin_t csn_pin; /* SPI Chip select */
- uint32_t spi_speed; /* SPI Bus Speed */
-#if defined(RF24_LINUX) || defined(XMEGA_D3) || defined(RF24_RP2)
- uint8_t spi_rxbuff[32 + 1]; //SPI receive buffer (payload max 32 bytes)
- uint8_t spi_txbuff[32 + 1]; //SPI transmit buffer (payload max 32 bytes + 1 byte for the command)
-#endif
- uint8_t status; /* The status byte returned from every SPI transaction */
- uint8_t payload_size; /* Fixed size of payloads */
- uint8_t pipe0_reading_address[5]; /* Last address set on pipe 0 for reading. */
- uint8_t pipe0_writing_address[5]; /* Last address set on pipe 0 for writing. */
- uint8_t config_reg; /* For storing the value of the CONFIG register */
- bool _is_p_variant; /* For storing the result of testing the toggleFeatures() affect */
- bool _is_p0_rx; /* For keeping track of pipe 0's usage in user-triggered RX mode. */
-
-protected:
- /**
- * SPI transactions
- *
- * Common code for SPI transactions including CSN toggle
- *
- */
- inline void beginTransaction();
-
- inline void endTransaction();
-
- /** Whether ack payloads are enabled. */
- bool ack_payloads_enabled;
- /** The address width to use (3, 4 or 5 bytes). */
- uint8_t addr_width;
- /** Whether dynamic payloads are enabled. */
- bool dynamic_payloads_enabled;
-
- /**
- * Read a chunk of data in from a register
- *
- * @param reg Which register. Use constants from nRF24L01.h
- * @param[out] buf Where to put the data
- * @param len How many bytes of data to transfer
- * @note This returns nothing. Older versions of this function returned the status
- * byte, but that it now saved to a private member on all SPI transactions.
- */
- void read_register(uint8_t reg, uint8_t* buf, uint8_t len);
-
- /**
- * Read single byte from a register
- *
- * @param reg Which register. Use constants from nRF24L01.h
- * @return Current value of register @p reg
- */
- uint8_t read_register(uint8_t reg);
-
-public:
- /**
- * @name Primary public interface
- *
- * These are the main methods you need to operate the chip
- */
- /**@{*/
-
- /**
- * RF24 Constructor
- *
- * Creates a new instance of this driver. Before using, you create an instance
- * and send in the unique pins that this chip is connected to.
- *
- * See [Related Pages](pages.html) for device specific information
- *
- * @param _cepin The pin attached to Chip Enable on the RF module.
- * Review our [Linux general](rpi_general.md) doc for details about selecting pin numbers on Linux systems.
- * @param _cspin The pin attached to Chip Select (often labeled CSN) on the radio module.
- * - For the Arduino Due board, the [Arduino Due extended SPI feature](https://www.arduino.cc/en/Reference/DueExtendedSPI)
- * is not supported. This means that the Due's pins 4, 10, or 52 are not mandated options (can use any digital output pin) for
- * the radio's CSN pin.
- * @param _spi_speed The SPI speed in Hz ie: 1000000 == 1Mhz
- * - Users can specify default SPI speed by modifying @ref RF24_SPI_SPEED in @ref RF24_config.h
- * - For Arduino, the default SPI speed will only be properly configured this way on devices supporting SPI TRANSACTIONS
- * - Older/Unsupported Arduino devices will use a default clock divider & settings configuration
- * - For Linux: The old way of setting SPI speeds using BCM2835 driver enums has been removed as of v1.3.7
- */
- RF24(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin, uint32_t _spi_speed = RF24_SPI_SPEED);
-
- /**
- * A constructor for initializing the radio's hardware dynamically
- * @warning You MUST use begin(rf24_gpio_pin_t, rf24_gpio_pin_t) or begin(_SPI*, rf24_gpio_pin_t, rf24_gpio_pin_t) to pass both the
- * digital output pin numbers connected to the radio's CE and CSN pins.
- * @param _spi_speed The SPI speed in Hz ie: 1000000 == 1Mhz
- * - Users can specify default SPI speed by modifying @ref RF24_SPI_SPEED in @ref RF24_config.h
- * - For Arduino, the default SPI speed will only be properly configured this way on devices supporting SPI TRANSACTIONS
- * - Older/Unsupported Arduino devices will use a default clock divider & settings configuration
- * - For Linux: The old way of setting SPI speeds using BCM2835 driver enums has been removed as of v1.3.7
- */
- RF24(uint32_t _spi_speed = RF24_SPI_SPEED);
-
-#if defined(RF24_LINUX)
- virtual ~RF24() {};
-#endif
-
- /**
- * Begin operation of the chip
- *
- * Call this in setup(), before calling any other methods.
- * @code
- * if (!radio.begin()) {
- * Serial.println(F("radio hardware not responding!"));
- * while (1) {} // hold program in infinite loop to prevent subsequent errors
- * }
- * @endcode
- * @return
- * - `true` if the radio was successfully initialized
- * - `false` if the MCU failed to communicate with the radio hardware
- */
- bool begin(void);
-
-#if defined(RF24_SPI_PTR) || defined(DOXYGEN_FORCED)
- /**
- * Same as begin(), but allows specifying a non-default SPI bus to use.
- *
- * @note This function assumes the `SPI::begin()` method was called before to
- * calling this function.
- *
- * @warning This function is for the Arduino platforms only
- *
- * @param spiBus A pointer or reference to an instantiated SPI bus object.
- * The `_SPI` datatype is a "wrapped" definition that will represent
- * various SPI implementations based on the specified platform.
- * @see Review the [Arduino support page](arduino.md).
- *
- * @return same result as begin()
- */
- bool begin(_SPI* spiBus);
-
- /**
- * Same as begin(), but allows dynamically specifying a SPI bus, CE pin,
- * and CSN pin to use.
- *
- * @note This function assumes the `SPI::begin()` method was called before to
- * calling this function.
- *
- * @warning This function is for the Arduino platforms only
- *
- * @param spiBus A pointer or reference to an instantiated SPI bus object.
- * The `_SPI` datatype is a "wrapped" definition that will represent
- * various SPI implementations based on the specified platform.
- * @param _cepin The pin attached to Chip Enable on the RF module.
- * Review our [Linux general](rpi_general.md) doc for details about selecting pin numbers on Linux systems.
- * @param _cspin The pin attached to Chip Select (often labeled CSN) on the radio module.
- * - For the Arduino Due board, the [Arduino Due extended SPI feature](https://www.arduino.cc/en/Reference/DueExtendedSPI)
- * is not supported. This means that the Due's pins 4, 10, or 52 are not mandated options (can use any digital output pin) for the radio's CSN pin.
- *
- * @see Review the [Arduino support page](arduino.md).
- *
- * @return same result as begin()
- */
- bool begin(_SPI* spiBus, rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin);
-#endif // defined (RF24_SPI_PTR) || defined (DOXYGEN_FORCED)
-
- /**
- * Same as begin(), but allows dynamically specifying a CE pin
- * and CSN pin to use.
- * @param _cepin The pin attached to Chip Enable on the RF module
- * @param _cspin The pin attached to Chip Select (often labeled CSN) on the radio module.
- * - For the Arduino Due board, the [Arduino Due extended SPI feature](https://www.arduino.cc/en/Reference/DueExtendedSPI)
- * is not supported. This means that the Due's pins 4, 10, or 52 are not mandated options (can use any digital output pin) for the radio's CSN pin.
- * @return same result as begin()
- */
- bool begin(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin);
-
- /**
- * Checks if the chip is connected to the SPI bus
- */
- bool isChipConnected();
-
- /**
- * Start listening on the pipes opened for reading.
- *
- * 1. Be sure to call openReadingPipe() first.
- * 2. Do not call write() while in this mode, without first calling stopListening().
- * 3. Call available() to check for incoming traffic, and read() to get it.
- *
- * Open reading pipe 1 using address `0xCCCECCCECC`
- * @code
- * byte address[] = {0xCC, 0xCE, 0xCC, 0xCE, 0xCC};
- * radio.openReadingPipe(1,address);
- * radio.startListening();
- * @endcode
- *
- * @note If there was a call to openReadingPipe() about pipe 0 prior to
- * calling this function, then this function will re-write the address
- * that was last set to reading pipe 0. This is because openWritingPipe()
- * will overwrite the address to reading pipe 0 for proper auto-ack
- * functionality.
- */
- void startListening(void);
-
- /**
- * Stop listening for incoming messages, and switch to transmit mode.
- *
- * Do this before calling write().
- * @code
- * radio.stopListening();
- * radio.write(&data, sizeof(data));
- * @endcode
- *
- * @warning When the ACK payloads feature is enabled, the TX FIFO buffers are
- * flushed when calling this function. This is meant to discard any ACK
- * payloads that were not appended to acknowledgment packets.
- */
- void stopListening(void);
-
- /**
- * @brief Similar to startListening(void) but changes the TX address.
- * @param txAddress The new TX address.
- * This value will be cached for auto-ack purposes.
- */
- void stopListening(const uint8_t* txAddress);
-
- /**
- * Check whether there are bytes available to be read
- * @code
- * if(radio.available()){
- * radio.read(&data,sizeof(data));
- * }
- * @endcode
- *
- * @see available(uint8_t*)
- *
- * @return True if there is a payload available, false if none is
- *
- * @warning This function relies on the information about the pipe number
- * that received the next available payload. According to the datasheet,
- * the data about the pipe number that received the next available payload
- * is "unreliable" during a FALLING transition on the IRQ pin. This means
- * you should call clearStatusFlags() before calling this function
- * during an ISR (Interrupt Service Routine). For example:
- * @code
- * void isrCallbackFunction() {
- * bool tx_ds, tx_df, rx_dr;
- * uint8_t flags = radio.clearStatusFlags(); // resets the IRQ pin to HIGH
- * radio.available(); // returned data should now be reliable
- * }
- *
- * void setup() {
- * pinMode(IRQ_PIN, INPUT);
- * attachInterrupt(digitalPinToInterrupt(IRQ_PIN), isrCallbackFunction, FALLING);
- * }
- * @endcode
- */
- bool available(void);
-
- /**
- * Read payload data from the RX FIFO buffer(s).
- *
- * The length of data read is usually the next available payload's length
- * @see
- * - getPayloadSize()
- * - getDynamicPayloadSize()
- *
- * @note I specifically chose `void*` as a data type to make it easier
- * for beginners to use. No casting needed.
- *
- * @param buf Pointer to a buffer where the data should be written
- * @param len Maximum number of bytes to read into the buffer. This
- * value should match the length of the object referenced using the
- * `buf` parameter. The absolute maximum number of bytes that can be read
- * in one call is 32 (for dynamic payload lengths) or whatever number was
- * previously passed to setPayloadSize() (for static payload lengths).
- * @remark
- * @parblock
- * Remember that each call to read() fetches data from the
- * RX FIFO beginning with the first byte from the first available
- * payload. A payload is not removed from the RX FIFO until it's
- * entire length (or more) is fetched using read().
- *
- * - If `len` parameter's value is less than the available payload's
- * length, then the payload remains in the RX FIFO.
- * - If `len` parameter's value is greater than the first of multiple
- * available payloads, then the data saved to the `buf`
- * parameter's object will be supplemented with data from the next
- * available payload.
- * - If `len` parameter's value is greater than the last available
- * payload's length, then the last byte in the payload is used as
- * padding for the data saved to the `buf` parameter's object.
- * The nRF24L01 will repeatedly use the last byte from the last
- * payload even when read() is called with an empty RX FIFO.
- * @endparblock
- * @note To use this function in the python wrapper, remember that
- * only the `len` parameter is required because this function (in the
- * python wrapper) returns the payload data as a buffer protocol object
- * (bytearray object).
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * if radio.available():
- * length = radio.getDynamicPayloadSize() # or radio.getPayloadSize() for static payload sizes
- * received_payload = radio.read(length)
- * @endcode
- *
- * @note This function no longer returns a boolean. Use available to
- * determine if packets are available. The `RX_DR` Interrupt flag is now
- * cleared with this function instead of when calling available().
- * @code
- * if(radio.available()) {
- * radio.read(&data, sizeof(data));
- * }
- * @endcode
- */
- void read(void* buf, uint8_t len);
-
- /**
- * Be sure to call openWritingPipe() first to set the destination
- * of where to write to.
- *
- * This blocks until the message is successfully acknowledged by
- * the receiver or the timeout/retransmit maxima are reached. In
- * the current configuration, the max delay here is 60-70ms.
- *
- * The maximum size of data written is the fixed payload size, see
- * getPayloadSize(). However, you can write less, and the remainder
- * will just be filled with zeroes.
- *
- * TX/RX/RT interrupt flags will be cleared every time write is called
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- *
- * @code
- * radio.stopListening();
- * radio.write(&data,sizeof(data));
- * @endcode
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.write(buffer)
- * @endcode
- *
- * @return
- * - `true` if the payload was delivered successfully and an acknowledgement
- * (ACK packet) was received. If auto-ack is disabled, then any attempt
- * to transmit will also return true (even if the payload was not
- * received).
- * - `false` if the payload was sent but was not acknowledged with an ACK
- * packet. This condition can only be reported if the auto-ack feature
- * is on.
- */
- bool write(const void* buf, uint8_t len);
-
- /**
- * New: Open a pipe for writing via byte array. Old addressing format retained
- * for compatibility.
- *
- * @deprecated Use `RF24::stopListening(uint8_t*)` instead.
- *
- * Only one writing pipe can be opened at once, but this function changes
- * the address that is used to transmit (ACK payloads/packets do not apply
- * here). Be sure to call stopListening() prior to calling this function.
- *
- * Addresses are assigned via a byte array, default is 5 byte address length
- *
- * @code
- * uint8_t addresses[][6] = {"1Node", "2Node"};
- * radio.openWritingPipe(addresses[0]);
- * @endcode
- * @code
- * uint8_t address[] = { 0xCC, 0xCE, 0xCC, 0xCE, 0xCC };
- * radio.openWritingPipe(address);
- * address[0] = 0x33;
- * radio.openReadingPipe(1, address);
- * @endcode
- *
- * @warning This function will overwrite the address set to reading pipe 0
- * as stipulated by the datasheet for proper auto-ack functionality in TX
- * mode. Use this function to ensure proper transmission acknowledgement
- * when the address set to reading pipe 0 (via openReadingPipe()) does not
- * match the address passed to this function. If the auto-ack feature is
- * disabled, then this function will still overwrite the address for
- * reading pipe 0 regardless.
- *
- * @see
- * - setAddressWidth()
- * - startListening()
- * - stopListening()
- *
- * @param address The address to be used for outgoing transmissions (uses
- * pipe 0). Coordinate this address amongst other receiving nodes (the
- * pipe numbers don't need to match). This address is cached to ensure proper
- * auto-ack behavior; stopListening() will always restore the latest cached TX
- * address.
- *
- * @remark There is no address length parameter because this function will
- * always write the number of bytes that the radio addresses are configured
- * to use (set with setAddressWidth()).
- */
-
- void openWritingPipe(const uint8_t* address);
-
- /**
- * Open a pipe for reading
- *
- * Up to 6 pipes can be open for reading at once. Open all the required
- * reading pipes, and then call startListening().
- *
- * @see
- * - openWritingPipe()
- * - setAddressWidth()
- *
- * @note Pipes 0 and 1 will store a full 5-byte address. Pipes 2-5 will technically
- * only store a single byte, borrowing up to 4 additional bytes from pipe 1 per the
- * assigned address width.
- * Pipes 1-5 should share the same address, except the first byte.
- * Only the first byte in the array should be unique, e.g.
- * @code
- * uint8_t addresses[][6] = {"Prime", "2Node", "3xxxx", "4xxxx"};
- * openReadingPipe(0, addresses[0]); // address used is "Prime"
- * openReadingPipe(1, addresses[1]); // address used is "2Node"
- * openReadingPipe(2, addresses[2]); // address used is "3Node"
- * openReadingPipe(3, addresses[3]); // address used is "4Node"
- * @endcode
- *
- * @warning
- * @parblock
- * If the reading pipe 0 is opened by this function, the address
- * passed to this function (for pipe 0) will be restored at every call to
- * startListening().
- *
- * Read
- * http://maniacalbits.blogspot.com/2013/04/rf24-addressing-nrf24l01-radios-require.html
- * to understand how to avoid using malformed addresses. This address
- * restoration is implemented because of the underlying necessary
- * functionality of openWritingPipe().
- * @endparblock
- *
- * @param number Which pipe to open. Only pipe numbers 0-5 are available,
- * an address assigned to any pipe number not in that range will be ignored.
- * @param address The 24, 32 or 40 bit address of the pipe to open.
- *
- * There is no address length parameter because this function will
- * always write the number of bytes (for pipes 0 and 1) that the radio
- * addresses are configured to use (set with setAddressWidth()).
- */
- void openReadingPipe(uint8_t number, const uint8_t* address);
-
- /**@}*/
- /**
- * @name Advanced Operation
- *
- * Methods you can use to drive the chip in more advanced ways
- */
- /**@{*/
-
- /**
- * Set radio's CE (Chip Enable) pin state.
- *
- * @warning Please see the datasheet for a much more detailed description of this pin.
- *
- * @note This is only publicly exposed for advanced use cases such as complex networking or
- * streaming consecutive payloads without robust error handling.
- * Typical uses are satisfied by simply using `startListening()` for RX mode or
- * `stopListening()` and `write()` for TX mode.
- *
- * @param level In RX mode, `HIGH` causes the radio to begin actively listening.
- * In TX mode, `HIGH` (+ 130 microsecond delay) causes the radio to begin transmitting.
- * Setting this to `LOW` will cause the radio to stop transmitting or receiving in any mode.
- */
- void ce(bool level);
-
- /**
- * Print a giant block of debugging information to stdout
- *
- * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
- * The printf.h file is included with the library for Arduino.
- * @code
- * #include <printf.h>
- * setup() {
- * Serial.begin(115200);
- * printf_begin();
- * // ...
- * }
- * @endcode
- */
- void printDetails(void);
-
- /**
- * Decode and print the given STATUS byte to stdout.
- *
- * @param flags The STATUS byte to print.
- * This value is fetched with update() or getStatusFlags().
- *
- * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
- */
- void printStatus(uint8_t flags);
-
- /**
- * Print a giant block of debugging information to stdout. This function
- * differs from printDetails() because it makes the information more
- * understandable without having to look up the datasheet or convert
- * hexadecimal to binary. Only use this function if your application can
- * spare extra bytes of memory.
- *
- * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
- * The printf.h file is included with the library for Arduino.
- * @code
- * #include <printf.h>
- * setup() {
- * Serial.begin(115200);
- * printf_begin();
- * // ...
- * }
- * @endcode
- *
- * @note If the automatic acknowledgements feature is configured differently
- * for each pipe, then a binary representation is used in which bits 0-5
- * represent pipes 0-5 respectively. A `0` means the feature is disabled, and
- * a `1` means the feature is enabled.
- */
- void printPrettyDetails(void);
-
- /**
- * Put a giant block of debugging information in a char array. This function
- * differs from printPrettyDetails() because it uses `sprintf()` and does not use
- * a predefined output stream (like `Serial` or stdout). Only use this function if
- * your application can spare extra bytes of memory. This can also be used for boards that
- * do not support `printf()` (which is required for printDetails() and printPrettyDetails()).
- *
- * @remark
- * The C standard function [sprintf()](http://www.cplusplus.com/reference/cstdio/sprintf)
- * formats a C-string in the exact same way as `printf()` but outputs (by reference)
- * into a char array. The formatted string literal for sprintf() is stored
- * in nonvolatile program memory.
- *
- * @warning Use a buffer of sufficient size for the `debugging_information`. Start
- * with a char array that has at least 870 elements. There is no overflow protection when using
- * sprintf(), so the output buffer must be sized correctly or the resulting behavior will
- * be undefined.
- * @code
- * char buffer[870] = {'\0'};
- * uint16_t used_chars = radio.sprintfPrettyDetails(buffer);
- * Serial.println(buffer);
- * Serial.print(F("strlen = "));
- * Serial.println(used_chars + 1); // +1 for c-strings' null terminating byte
- * @endcode
- *
- * @param debugging_information The c-string buffer that the debugging
- * information is stored to. This must be allocated to a minimum of 870 bytes of memory.
- * @returns The number of characters altered in the given buffer. Remember that,
- * like `sprintf()`, this returned number does not include the null terminating byte.
- *
- * This function is available in the python wrapper, but it accepts no parameters and
- * returns a string. It does not return the number of characters in the string.
- * @code{.py}
- * debug_info = radio.sprintfPrettyDetails()
- * print(debug_info)
- * print("str_len =", len(debug_info))
- * @endcode
- *
- * @note If the automatic acknowledgements feature is configured differently
- * for each pipe, then a binary representation is used in which bits 0-5
- * represent pipes 0-5 respectively. A `0` means the feature is disabled, and
- * a `1` means the feature is enabled.
- */
- uint16_t sprintfPrettyDetails(char* debugging_information);
-
- /**
- * Encode radio debugging information into an array of uint8_t. This function
- * differs from other debug output methods because the debug information can
- * be decoded by an external program.
- *
- * This function is not available in the python wrapper because it is intended for
- * use on processors with very limited available resources.
- *
- * @remark
- * This function uses much less ram than other `*print*Details()` methods.
- *
- * @code
- * uint8_t encoded_details[43] = {0};
- * radio.encodeRadioDetails(encoded_details);
- * @endcode
- *
- * @param encoded_status The uint8_t array that RF24 radio details are
- * encoded into. This array must be at least 43 bytes in length; any less would surely
- * cause undefined behavior.
- *
- * Registers names and/or data corresponding to the index of the `encoded_details` array:
- * | index | register/data |
- * |------:|:--------------|
- * | 0 | CONFIG |
- * | 1 | EN_AA |
- * | 2 | EN_RXADDR |
- * | 3 | SETUP_AW |
- * | 4 | SETUP_RETR |
- * | 5 | RF_CH |
- * | 6 | RF_SETUP |
- * | 7 | STATUS |
- * | 8 | OBSERVE_TX |
- * | 9 | CD (aka RPD) |
- * | 10-14 | RX_ADDR_P0 |
- * | 15-19 | RX_ADDR_P1 |
- * | 20 | RX_ADDR_P2 |
- * | 21 | RX_ADDR_P3 |
- * | 22 | RX_ADDR_P4 |
- * | 23 | RX_ADDR_P5 |
- * | 24-28 | TX_ADDR |
- * | 29 | RX_PW_P0 |
- * | 30 | RX_PW_P1 |
- * | 31 | RX_PW_P2 |
- * | 32 | RX_PW_P3 |
- * | 33 | RX_PW_P4 |
- * | 34 | RX_PW_P5 |
- * | 35 | FIFO_STATUS |
- * | 36 | DYNPD |
- * | 37 | FEATURE |
- * | 38-39 | ce_pin |
- * | 40-41 | csn_pin |
- * | 42 | SPI speed (in MHz) or'd with (isPlusVariant << 4) |
- */
- void encodeRadioDetails(uint8_t* encoded_status);
-
- /**
- * Test whether there are bytes available to be read from the
- * FIFO buffers.
- *
- * @note This function is named `available_pipe()` in the python wrapper.
- * @parblock
- * Additionally, the `available_pipe()` function (which
- * takes no arguments) returns a 2 item tuple containing (ordered by
- * tuple's indices):
- * - A boolean describing if there is a payload available to read from
- * the RX FIFO buffers.
- * - The pipe number that received the next available payload in the RX
- * FIFO buffers. If the item at the tuple's index 0 is `False`, then
- * this pipe number is invalid.
- *
- * To use this function in python:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * has_payload, pipe_number = radio.available_pipe() # expand the tuple to 2 variables
- * if has_payload:
- * print("Received a payload with pipe", pipe_number)
- * @endcode
- * @endparblock
- *
- * @param[out] pipe_num Which pipe has the payload available
- * @code
- * uint8_t pipeNum;
- * if(radio.available(&pipeNum)){
- * radio.read(&data, sizeof(data));
- * Serial.print("Received data on pipe ");
- * Serial.println(pipeNum);
- * }
- * @endcode
- *
- * @warning According to the datasheet, the data saved to `pipe_num` is
- * "unreliable" during a FALLING transition on the IRQ pin. This means you
- * should call clearStatusFlags() before calling this function during
- * an ISR (Interrupt Service Routine). For example:
- * @code
- * void isrCallbackFunction() {
- * radio.clearStatusFlags(); // resets the IRQ pin to inactive HIGH
- * uint8_t pipe = 7; // initialize pipe data
- * radio.available(&pipe); // pipe data should now be reliable
- * }
- *
- * void setup() {
- * pinMode(IRQ_PIN, INPUT);
- * attachInterrupt(digitalPinToInterrupt(IRQ_PIN), isrCallbackFunction, FALLING);
- * }
- * @endcode
- *
- * @return
- * - `true` if there is a payload available in the top (first out)
- * level RX FIFO.
- * - `false` if there is nothing available in the RX FIFO because it is
- * empty.
- */
- bool available(uint8_t* pipe_num);
-
- /**
- * Use this function to check if the radio's RX FIFO levels are all
- * occupied. This can be used to prevent data loss because any incoming
- * transmissions are rejected if there is no unoccupied levels in the RX
- * FIFO to store the incoming payload. Remember that each level can hold
- * up to a maximum of 32 bytes.
- * @return
- * - `true` if all three 3 levels of the RX FIFO buffers are occupied.
- * - `false` if there is one or more levels available in the RX FIFO
- * buffers. Remember that this does not always mean that the RX FIFO
- * buffers are empty; use available() to see if the RX FIFO buffers are
- * empty or not.
- */
- bool rxFifoFull();
-
- /**
- * @param about_tx `true` focuses on the TX FIFO, `false` focuses on the RX FIFO
- * @return
- * - @ref RF24_FIFO_OCCUPIED (`0`) if the specified FIFO is neither full nor empty.
- * - @ref RF24_FIFO_EMPTY (`1`) if the specified FIFO is empty.
- * - @ref RF24_FIFO_FULL (`2`) if the specified FIFO is full.
- * - @ref RF24_FIFO_INVALID (`3`) if the data fetched over SPI was malformed.
- */
- rf24_fifo_state_e isFifo(bool about_tx);
-
- /**
- * @deprecated Use RF24::isFifo(bool about_tx) instead.
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * @param about_tx `true` focuses on the TX FIFO, `false` focuses on the RX FIFO
- * @param check_empty
- * - `true` checks if the specified FIFO is empty
- * - `false` checks is the specified FIFO is full.
- * @return A boolean answer to the question "is the [TX/RX] FIFO [empty/full]?"
- */
- bool isFifo(bool about_tx, bool check_empty);
-
- /**
- * Enter low-power mode
- *
- * To return to normal power mode, call powerUp().
- *
- * @note After calling startListening(), a basic radio will consume about 13.5mA
- * at max PA level.
- * During active transmission, the radio will consume about 11.5mA, but this will
- * be reduced to 26uA (.026mA) between sending.
- * In full powerDown mode, the radio will consume approximately 900nA (.0009mA)
- *
- * @code
- * radio.powerDown();
- * avr_enter_sleep_mode(); // Custom function to sleep the device
- * radio.powerUp();
- * @endcode
- */
- void powerDown(void);
-
- /**
- * Leave low-power mode - required for normal radio operation after calling powerDown()
- *
- * To return to low power mode, call powerDown().
- * @note This will take up to 5ms for maximum compatibility
- */
- void powerUp(void);
-
- /**
- * Write for single NOACK writes. Optionally disable
- * acknowledgements/auto-retries for a single payload using the
- * multicast parameter set to true.
- *
- * Can be used with enableAckPayload() to request a response
- * @see
- * - setAutoAck()
- * - write()
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- * @param multicast Request ACK response (false), or no ACK response
- * (true). Be sure to have called enableDynamicAck() at least once before
- * setting this parameter.
- * @return
- * - `true` if the payload was delivered successfully and an acknowledgement
- * (ACK packet) was received. If auto-ack is disabled, then any attempt
- * to transmit will also return true (even if the payload was not
- * received).
- * - `false` if the payload was sent but was not acknowledged with an ACK
- * packet. This condition can only be reported if the auto-ack feature
- * is on.
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.write(buffer, False) # False = the multicast parameter
- * @endcode
- */
- bool write(const void* buf, uint8_t len, const bool multicast);
-
- /**
- * This will not block until the 3 FIFO buffers are filled with data.
- * Once the FIFOs are full, writeFast() will simply wait for a buffer to
- * become available or a transmission failure (returning `true` or `false`
- * respectively).
- *
- * @warning
- * @parblock
- * It is important to never keep the nRF24L01 in TX mode and FIFO full for more than 4ms at a time. If the auto
- * retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO
- * to clear by issuing txStandBy() or ensure appropriate time between transmissions.
- *
- * Use txStandBy() when this function returns `false`.
- *
- * Example (Partial blocking):
- * @code
- * radio.writeFast(&buf,32); // Writes 1 payload to the buffers
- * txStandBy(); // Returns 0 if failed. 1 if success. Blocks only until MAX_RT timeout or success. Data flushed on fail.
- *
- * radio.writeFast(&buf,32); // Writes 1 payload to the buffers
- * txStandBy(1000); // Using extended timeouts, returns 1 if success. Retries failed payloads for 1 seconds before returning 0.
- * @endcode
- * @endparblock
- *
- * @see
- * - setAutoAck()
- * - txStandBy()
- * - write()
- * - writeBlocking()
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- * @return
- * - `true` if the payload passed to `buf` was loaded in the TX FIFO.
- * - `false` if the payload passed to `buf` was not loaded in the TX FIFO
- * because a previous payload already in the TX FIFO failed to
- * transmit. This condition can only be reported if the auto-ack feature
- * is on.
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.writeFast(buffer)
- * @endcode
- */
- bool writeFast(const void* buf, uint8_t len);
-
- /**
- * Similar to writeFast(const void*, uint8_t) but allows for single NOACK writes.
- * Optionally disable acknowledgements/auto-retries for a single payload using the
- * multicast parameter set to `true`.
- *
- * @warning If the auto-ack feature is enabled, then it is strongly encouraged to call
- * txStandBy() when this function returns `false`.
- *
- * @see
- * - setAutoAck()
- * - txStandBy()
- * - write()
- * - writeBlocking()
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- * @param multicast Request ACK response (false), or no ACK response
- * (true). Be sure to have called enableDynamicAck() at least once before
- * setting this parameter.
- * @return
- * - `true` if the payload passed to `buf` was loaded in the TX FIFO.
- * - `false` if the payload passed to `buf` was not loaded in the TX FIFO
- * because a previous payload already in the TX FIFO failed to
- * transmit. This condition can only be reported if the auto-ack feature
- * is on (and the multicast parameter is set to false).
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.writeFast(buffer, False) # False = the multicast parameter
- * @endcode
- */
- bool writeFast(const void* buf, uint8_t len, const bool multicast);
-
- /**
- * This function extends the auto-retry mechanism to any specified duration.
- * It will not block until the 3 FIFO buffers are filled with data.
- * If so the library will auto retry until a new payload is written
- * or the user specified timeout period is reached.
- * @warning It is important to never keep the nRF24L01 in TX mode and FIFO full for more than 4ms at a time. If the auto
- * retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO
- * to clear by issuing txStandBy() or ensure appropriate time between transmissions.
- *
- * Example (Full blocking):
- * @code
- * radio.writeBlocking(&buf, sizeof(buf), 1000); // Wait up to 1 second to write 1 payload to the buffers
- * radio.txStandBy(1000); // Wait up to 1 second for the payload to send. Return 1 if ok, 0 if failed.
- * // Blocks only until user timeout or success. Data flushed on fail.
- * @endcode
- * @note If used from within an interrupt, the interrupt should be disabled until completion, and sei(); called to enable millis().
- * @see
- * - txStandBy()
- * - write()
- * - writeFast()
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- * @param timeout User defined timeout in milliseconds.
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.writeBlocking(buffer, 1000) # 1000 means wait at most 1 second
- * @endcode
- *
- * @return
- * - `true` if the payload passed to `buf` was loaded in the TX FIFO.
- * - `false` if the payload passed to `buf` was not loaded in the TX FIFO
- * because a previous payload already in the TX FIFO failed to
- * transmit. This condition can only be reported if the auto-ack feature
- * is on.
- */
- bool writeBlocking(const void* buf, uint8_t len, uint32_t timeout);
-
- /**
- * This function should be called as soon as transmission is finished to
- * drop the radio back to STANDBY-I mode. If not issued, the radio will
- * remain in STANDBY-II mode which, per the data sheet, is not a recommended
- * operating mode.
- *
- * @note When transmitting data in rapid succession, it is still recommended by
- * the manufacturer to drop the radio out of TX or STANDBY-II mode if there is
- * time enough between sends for the FIFOs to empty. This is not required if auto-ack
- * is enabled.
- *
- * Relies on built-in auto retry functionality.
- *
- * Example (Partial blocking):
- * @code
- * radio.writeFast(&buf, 32);
- * radio.writeFast(&buf, 32);
- * radio.writeFast(&buf, 32); //Fills the FIFO buffers up
- * bool ok = radio.txStandBy(); //Returns 0 if failed. 1 if success.
- * //Blocks only until MAX_RT timeout or success. Data flushed on fail.
- * @endcode
- * @see txStandBy(uint32_t timeout, bool startTx)
- * @return
- * - `true` if all payloads in the TX FIFO were delivered successfully and
- * an acknowledgement (ACK packet) was received for each. If auto-ack is
- * disabled, then any attempt to transmit will also return true (even if
- * the payload was not received).
- * - `false` if a payload was sent but was not acknowledged with an ACK
- * packet. This condition can only be reported if the auto-ack feature
- * is on.
- */
- bool txStandBy();
-
- /**
- * This function allows extended blocking and auto-retries per a user defined timeout
- *
- * Fully Blocking Example:
- * @code
- * radio.writeFast(&buf, 32);
- * radio.writeFast(&buf, 32);
- * radio.writeFast(&buf, 32); //Fills the FIFO buffers up
- * bool ok = radio.txStandBy(1000); //Returns 0 if failed after 1 second of retries. 1 if success.
- * //Blocks only until user defined timeout or success. Data flushed on fail.
- * @endcode
- * @note If used from within an interrupt, the interrupt should be disabled until completion, and sei(); called to enable millis().
- * @param timeout Number of milliseconds to retry failed payloads
- * @param startTx If this is set to `true`, then this function puts the nRF24L01
- * in TX Mode. `false` leaves the primary mode (TX or RX) as it is, which can
- * prevent the mandatory wait time to change modes.
- * @return
- * - `true` if all payloads in the TX FIFO were delivered successfully and
- * an acknowledgement (ACK packet) was received for each. If auto-ack is
- * disabled, then any attempt to transmit will also return true (even if
- * the payload was not received).
- * - `false` if a payload was sent but was not acknowledged with an ACK
- * packet. This condition can only be reported if the auto-ack feature
- * is on.
- */
- bool txStandBy(uint32_t timeout, bool startTx = 0);
-
- /**
- * Write an acknowledgement (ACK) payload for the specified pipe
- *
- * The next time a message is received on a specified `pipe`, the data in
- * `buf` will be sent back in the ACK payload.
- *
- * @see
- * - enableAckPayload()
- * - enableDynamicPayloads()
- *
- * @note ACK payloads are handled automatically by the radio chip when a
- * regular payload is received. It is important to discard regular payloads
- * in the TX FIFO (using flush_tx()) before loading the first ACK payload
- * into the TX FIFO. This function can be called before and after calling
- * startListening().
- *
- * @warning Only three of these can be pending at any time as there are
- * only 3 FIFO buffers. Dynamic payloads must be enabled.
- *
- * @note ACK payloads are dynamic payloads. Calling enableAckPayload()
- * will automatically enable dynamic payloads on pipe 0 (required for TX
- * mode when expecting ACK payloads) & pipe 1. To use ACK payloads on any other
- * pipe in RX mode, call enableDynamicPayloads().
- *
- * @param pipe Which pipe# (typically 1-5) will get this response.
- * @param buf Pointer to data that is sent
- * @param len Length of the data to send, up to 32 bytes max. Not affected
- * by the static payload size set by setPayloadSize().
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.writeAckPayload(1, buffer) # load an ACK payload for response on pipe 1
- * @endcode
- *
- * @return
- * - `true` if the payload was loaded into the TX FIFO.
- * - `false` if the payload wasn't loaded into the TX FIFO because it is
- * already full or the ACK payload feature is not enabled using
- * enableAckPayload().
- */
- bool writeAckPayload(uint8_t pipe, const void* buf, uint8_t len);
-
- /**
- * Clear the Status flags that caused an interrupt event.
- *
- * @remark This function is similar to `whatHappened()` because it also returns the
- * Status flags that caused the interrupt event. However, this function returns
- * a STATUS byte instead of bit-banging into 3 1-byte booleans
- * passed by reference.
- *
- * @note When used in an ISR (Interrupt Service routine), there is a chance that the
- * returned bits 0b1110 (rx_pipe number) is inaccurate. See available(uint8_t*) (or the
- * datasheet) for more detail.
- *
- * @param flags The IRQ flags to clear. Default value is all of them (`RF24_IRQ_ALL`).
- * Multiple flags can be cleared by OR-ing rf24_irq_flags_e values together.
- *
- * @returns The STATUS byte from the radio's register before it was modified. Use
- * enumerations of rf24_irq_flags_e as masks to interpret the STATUS byte's meaning(s).
- *
- * @ingroup StatusFlags
- */
- uint8_t clearStatusFlags(uint8_t flags = RF24_IRQ_ALL);
-
- /**
- * Set which flags shall be reflected on the radio's IRQ pin.
- *
- * @remarks This function is similar to maskIRQ() but with less confusing parameters.
- *
- * @param flags A value of rf24_irq_flags_e to influence the radio's IRQ pin.
- * The default value (`RF24_IRQ_NONE`) will disable the radio's IRQ pin.
- * Multiple events can be enabled by OR-ing rf24_irq_flags_e values together.
- * ```cpp
- * radio.setStatusFlags(RF24_IRQ_ALL);
- * // is equivalent to
- * radio.setStatusFlags(RF24_RX_DR | RF24_TX_DS | RF24_TX_DF);
- * ```
- *
- * @ingroup StatusFlags
- */
- void setStatusFlags(uint8_t flags = RF24_IRQ_NONE);
-
- /**
- * Get the latest STATUS byte returned from the last SPI transaction.
- *
- * @note This does not actually perform any SPI transaction with the radio.
- * Use `RF24::update()` instead to get a fresh copy of the Status flags at
- * the slight cost of performance.
- *
- * @returns The STATUS byte from the radio's register as the latest SPI transaction. Use
- * enumerations of rf24_irq_flags_e as masks to interpret the STATUS byte's meaning(s).
- *
- * @ingroup StatusFlags
- */
- uint8_t getStatusFlags();
-
- /**
- * Get an updated STATUS byte from the radio.
- *
- * @returns The STATUS byte fetched from the radio's register. Use enumerations of
- * rf24_irq_flags_e as masks to interpret the STATUS byte's meaning(s).
- *
- * @ingroup StatusFlags
- */
- uint8_t update();
-
- /**
- * Non-blocking write to the open writing pipe used for buffered writes
- *
- * @note Optimization: This function now leaves the CE pin high, so the radio
- * will remain in TX or STANDBY-II Mode until a txStandBy() command is issued. Can be used as an alternative to startWrite()
- * if writing multiple payloads at once.
- * @warning It is important to never keep the nRF24L01 in TX mode with FIFO full for more than 4ms at a time. If the auto
- * retransmit/autoAck is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO
- * to clear by issuing txStandBy() or ensure appropriate time between transmissions.
- *
- * @see
- * - write()
- * - writeFast()
- * - startWrite()
- * - writeBlocking()
- * - setAutoAck() (for single noAck writes)
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- * @param multicast Request ACK response (false), or no ACK response
- * (true). Be sure to have called enableDynamicAck() at least once before
- * setting this parameter.
- * @param startTx If this is set to `true`, then this function sets the
- * nRF24L01's CE pin to active (enabling TX transmissions). `false` has no
- * effect on the nRF24L01's CE pin and simply loads the payload into the
- * TX FIFO.
- *
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.startFastWrite(buffer, False, True) # 3rd parameter is optional
- * # False means expecting ACK response (multicast parameter)
- * # True means initiate transmission (startTx parameter)
- * @endcode
- */
- void startFastWrite(const void* buf, uint8_t len, const bool multicast, bool startTx = 1);
-
- /**
- * Non-blocking write to the open writing pipe
- *
- * Just like write(), but it returns immediately. To find out what happened
- * to the send, catch the IRQ and then call clearStatusFlags() or update().
- *
- * @see
- * - write()
- * - writeFast()
- * - startFastWrite()
- * - clearStatusFlags()
- * - setAutoAck() (for single noAck writes)
- *
- * @param buf Pointer to the data to be sent
- * @param len Number of bytes to be sent
- * @param multicast Request ACK response (false), or no ACK response
- * (true). Be sure to have called enableDynamicAck() at least once before
- * setting this parameter.
- *
- * @return
- * - `true` if payload was written to the TX FIFO buffers and the
- * transmission was started.
- * - `false` if the TX FIFO is full and the payload could not be written. In
- * this condition, the transmission process is restarted.
- * @note The `len` parameter must be omitted when using the python
- * wrapper because the length of the payload is determined automatically.
- * To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * buffer = b"Hello World" # a `bytes` object
- * radio.startWrite(buffer, False) # False = the multicast parameter
- * @endcode
- */
- bool startWrite(const void* buf, uint8_t len, const bool multicast);
-
- /**
- * The function will instruct the radio to re-use the payload in the
- * top level (first out) of the TX FIFO buffers. This is used internally
- * by writeBlocking() to initiate retries when a TX failure
- * occurs. Retries are automatically initiated except with the standard
- * write(). This way, data is not flushed from the buffer until calling
- * flush_tx(). If the TX FIFO has only the one payload (in the top level),
- * the re-used payload can be overwritten by using write(), writeFast(),
- * writeBlocking(), startWrite(), or startFastWrite(). If the TX FIFO has
- * other payloads enqueued, then the aforementioned functions will attempt
- * to enqueue the a new payload in the TX FIFO (does not overwrite the top
- * level of the TX FIFO). Currently, stopListening() also calls flush_tx()
- * when ACK payloads are enabled (via enableAckPayload()).
- *
- * Upon exiting, this function will set the CE pin HIGH to initiate the
- * re-transmission process. If only 1 re-transmission is desired, then the
- * CE pin should be set to LOW after the mandatory minumum pulse duration
- * of 10 microseconds.
- *
- * @remark This function only applies when taking advantage of the
- * auto-retry feature. See setAutoAck() and setRetries() to configure the
- * auto-retry feature.
- *
- * @note This is to be used AFTER auto-retry fails if wanting to resend
- * using the built-in payload reuse feature. After issuing reUseTX(), it
- * will keep resending the same payload until a transmission failure
- * occurs or the CE pin is set to LOW (whichever comes first). In the
- * event of a re-transmission failure, simply call this function again to
- * resume re-transmission of the same payload.
- */
- void reUseTX();
-
- /**
- * Empty all 3 of the TX (transmit) FIFO buffers. This is automatically
- * called by stopListening() if ACK payloads are enabled. However,
- * startListening() does not call this function.
- *
- * @return Current value of status register
- */
- uint8_t flush_tx(void);
-
- /**
- * Empty all 3 of the RX (receive) FIFO buffers.
- *
- * @return Current value of status register
- */
- uint8_t flush_rx(void);
-
- /**
- * Test whether there was a carrier on the line for the
- * previous listening period.
- *
- * Useful to check for interference on the current channel.
- *
- * @return true if was carrier, false if not
- */
- bool testCarrier(void);
-
- /**
- * Test whether a signal (carrier or otherwise) greater than
- * or equal to -64dBm is present on the channel. Valid only
- * on nRF24L01P (+) hardware. On nRF24L01, use testCarrier().
- *
- * Useful to check for interference on the current channel and
- * channel hopping strategies.
- *
- * @code
- * bool goodSignal = radio.testRPD();
- * if(radio.available()){
- * Serial.println(goodSignal ? "Strong signal > -64dBm" : "Weak signal < -64dBm" );
- * radio.read(&payload,sizeof(payload));
- * }
- * @endcode
- * @return true if a signal greater than or equal to -64dBm was detected,
- * false if not.
- */
- bool testRPD(void);
-
- /**
- * Test whether this is a real radio, or a mock shim for
- * debugging. Setting either pin to 0xff is the way to
- * indicate that this is not a real radio.
- *
- * @return true if this is a legitimate radio
- */
- bool isValid();
-
- /**
- * Close a pipe after it has been previously opened.
- * Can be safely called without having previously opened a pipe.
- * @param pipe Which pipe number to close, any integer not in range [0, 5]
- * is ignored.
- */
- void closeReadingPipe(uint8_t pipe);
-
-#if defined(FAILURE_HANDLING)
- /**
- *
- * If a failure has been detected, it usually indicates a hardware issue. By default the library
- * will cease operation when a failure is detected.
- * This should allow advanced users to detect and resolve intermittent hardware issues.
- *
- * In most cases, the radio must be re-enabled via radio.begin(); and the appropriate settings
- * applied after a failure occurs, if wanting to re-enable the device immediately.
- *
- * The three main failure modes of the radio include:
- *
- * 1. Writing to radio: Radio unresponsive
- * - Fixed internally by adding a timeout to the internal write functions in RF24 (failure handling)
- * 2. Reading from radio: Available returns true always
- * - Fixed by adding a timeout to available functions by the user. This is implemented internally in RF24Network.
- * 3. Radio configuration settings are lost
- * - Fixed by monitoring a value that is different from the default, and re-configuring the radio if this setting reverts to the default.
- *
- * See the included example, GettingStarted_HandlingFailures
- *
- * @code
- * if(radio.failureDetected) {
- * radio.begin(); // Attempt to re-configure the radio with defaults
- * radio.failureDetected = 0; // Reset the detection value
- * radio.openWritingPipe(addresses[1]); // Re-configure pipe addresses
- * radio.openReadingPipe(1, addresses[0]);
- * report_failure(); // Blink LEDs, send a message, etc. to indicate failure
- * }
- * @endcode
- */
- bool failureDetected;
- uint16_t failureRecoveryAttempts;
-
-#endif // defined (FAILURE_HANDLING)
-
- /**@}*/
- /**
- * @name Optional Configurators
- *
- * Methods you can use to get or set the configuration of the chip.
- * None are required. Calling begin() sets up a reasonable set of
- * defaults.
- */
- /**@{*/
-
- /**
- * Set the address width from 3 to 5 bytes (24, 32 or 40 bit)
- *
- * @param a_width The address width (in bytes) to use; this can be 3, 4 or
- * 5.
- */
- void setAddressWidth(uint8_t a_width);
-
- /**
- * Set the number of retry attempts and delay between retry attempts when
- * transmitting a payload. The radio is waiting for an acknowledgement
- * (ACK) packet during the delay between retry attempts.
- *
- * @param delay How long to wait between each retry, in multiples of
- * 250 us. The minimum of 0 means 250 us, and the maximum of 15 means
- * 4000 us. The default value of 5 means 1500us (5 * 250 + 250).
- * @param count How many retries before giving up. The default/maximum is 15. Use
- * 0 to disable the auto-retry feature all together.
- *
- * @note Disable the auto-retry feature on a transmitter still uses the
- * auto-ack feature (if enabled), except it will not retry to transmit if
- * the payload was not acknowledged on the first attempt.
- */
- void setRetries(uint8_t delay, uint8_t count);
-
- /**
- * Set RF communication channel. The frequency used by a channel is
- * calculated as:
- * @verbatim 2400 MHz + <channel number> @endverbatim
- * Meaning the default channel of 76 uses the approximate frequency of
- * 2476 MHz.
- *
- * @note In the python wrapper, this function is the setter of the
- * `channel` attribute.To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * radio.channel = 2 # set the channel to 2 (2402 MHz)
- * @endcode
- *
- * @param channel Which RF channel to communicate on, 0-125
- */
- void setChannel(uint8_t channel);
-
- /**
- * Get RF communication channel
- *
- * @note In the python wrapper, this function is the getter of the
- * `channel` attribute.To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * chn = radio.channel # get the channel
- * @endcode
- *
- * @return The currently configured RF Channel
- */
- uint8_t getChannel(void);
-
- /**
- * Set Static Payload Size
- *
- * This implementation uses a pre-established fixed payload size for all
- * transmissions. If this method is never called, the driver will always
- * transmit the maximum payload size (32 bytes), no matter how much
- * was sent to write().
- *
- * @note In the python wrapper, this function is the setter of the
- * `payloadSize` attribute.To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * radio.payloadSize = 16 # set the static payload size to 16 bytes
- * @endcode
- *
- * @param size The number of bytes in the payload
- */
- void setPayloadSize(uint8_t size);
-
- /**
- * Get Static Payload Size
- *
- * @note In the python wrapper, this function is the getter of the
- * `payloadSize` attribute.To use this function in the python wrapper:
- * @code{.py}
- * # let `radio` be the instantiated RF24 object
- * pl_size = radio.payloadSize # get the static payload size
- * @endcode
- *
- * @see setPayloadSize()
- *
- * @return The number of bytes in the payload
- */
- uint8_t getPayloadSize(void);
-
- /**
- * Get Dynamic Payload Size
- *
- * For dynamic payloads, this pulls the size of the payload off
- * the chip
- *
- * @note Corrupt packets are now detected and flushed per the
- * manufacturer.
- * @code
- * if(radio.available()){
- * if(radio.getDynamicPayloadSize() < 1){
- * // Corrupt payload has been flushed
- * return;
- * }
- * radio.read(&data,sizeof(data));
- * }
- * @endcode
- *
- * @return Payload length of last-received dynamic payload
- */
- uint8_t getDynamicPayloadSize(void);
-
- /**
- * Enable custom payloads in the acknowledge packets
- *
- * ACK payloads are a handy way to return data back to senders without
- * manually changing the radio modes on both units.
- *
- * @remarks The ACK payload feature requires the auto-ack feature to be
- * enabled for any pipe using ACK payloads. This function does not
- * automatically enable the auto-ack feature on pipe 0 since the auto-ack
- * feature is enabled for all pipes by default.
- *
- * @see setAutoAck()
- *
- * @note ACK payloads are dynamic payloads. This function automatically
- * enables dynamic payloads on pipes 0 & 1 by default. Call
- * enableDynamicPayloads() to enable on all pipes (especially for RX nodes
- * that use pipes other than pipe 0 to receive transmissions expecting
- * responses with ACK payloads).
- */
- void enableAckPayload(void);
-
- /**
- * Disable custom payloads on the acknowledge packets
- *
- * @see enableAckPayload()
- */
- void disableAckPayload(void);
-
- /**
- * Enable dynamically-sized payloads
- *
- * This way you don't always have to send large packets just to send them
- * once in a while. This enables dynamic payloads on ALL pipes.
- *
- */
- void enableDynamicPayloads(void);
-
- /**
- * Disable dynamically-sized payloads
- *
- * This disables dynamic payloads on ALL pipes. Since Ack Payloads
- * requires Dynamic Payloads, Ack Payloads are also disabled.
- * If dynamic payloads are later re-enabled and ack payloads are desired
- * then enableAckPayload() must be called again as well.
- *
- */
- void disableDynamicPayloads(void);
-
- /**
- * Enable dynamic ACKs (single write multicast or unicast) for chosen
- * messages.
- *
- * @note This function must be called once before using the multicast
- * parameter for any functions that offer it. To use multicast behavior
- * about all outgoing payloads (using pipe 0) or incoming payloads
- * (concerning all RX pipes), use setAutoAck()
- *
- * @see
- * - setAutoAck() for all pipes
- * - setAutoAck(uint8_t, bool) for individual pipes
- *
- * @code
- * radio.write(&data, 32, 1); // Sends a payload with no acknowledgement requested
- * radio.write(&data, 32, 0); // Sends a payload using auto-retry/autoACK
- * @endcode
- */
- void enableDynamicAck();
-
- /**
- * Determine whether the hardware is an nRF24L01+ or not.
- *
- * @return true if the hardware is nRF24L01+ (or compatible) and false
- * if its not.
- */
- bool isPVariant(void);
-
- /**
- * Enable or disable the auto-acknowledgement feature for all pipes. This
- * feature is enabled by default. Auto-acknowledgement responds to every
- * received payload with an empty ACK packet. These ACK packets get sent
- * from the receiving radio back to the transmitting radio. To attach an
- * ACK payload to a ACK packet, use writeAckPayload().
- *
- * If this feature is disabled on a transmitting radio, then the
- * transmitting radio will always report that the payload was received
- * (even if it was not). Please remember that this feature's configuration
- * needs to match for transmitting and receiving radios.
- *
- * @warning When using the `multicast` parameter to write(), this feature
- * can be disabled for an individual payload. However, if this feature is
- * disabled, then the `multicast` parameter will have no effect.
- *
- * @note If disabling auto-acknowledgment packets, the ACK payloads
- * feature is also disabled as this feature is required to send ACK
- * payloads.
- *
- * @see
- * - write()
- * - writeFast()
- * - startFastWrite()
- * - startWrite()
- * - writeAckPayload()
- *
- * @param enable Whether to enable (true) or disable (false) the
- * auto-acknowledgment feature for all pipes
- */
- void setAutoAck(bool enable);
-
- /**
- * Enable or disable the auto-acknowledgement feature for a specific pipe.
- * This feature is enabled by default for all pipes. Auto-acknowledgement
- * responds to every received payload with an empty ACK packet. These ACK
- * packets get sent from the receiving radio back to the transmitting
- * radio. To attach an ACK payload to a ACK packet, use writeAckPayload().
- *
- * Pipe 0 is used for TX operations, which include sending ACK packets. If
- * using this feature on both TX & RX nodes, then pipe 0 must have this
- * feature enabled for the RX & TX operations. If this feature is disabled
- * on a transmitting radio's pipe 0, then the transmitting radio will
- * always report that the payload was received (even if it was not).
- * Remember to also enable this feature for any pipe that is openly
- * listening to a transmitting radio with this feature enabled.
- *
- * @warning If this feature is enabled for pipe 0, then the `multicast`
- * parameter to write() can be used to disable this feature for an
- * individual payload. However, if this feature is disabled for pipe 0,
- * then the `multicast` parameter will have no effect.
- *
- * @note If disabling auto-acknowledgment packets on pipe 0, the ACK
- * payloads feature is also disabled as this feature is required on pipe 0
- * to send ACK payloads.
- *
- * @see
- * - write()
- * - writeFast()
- * - startFastWrite()
- * - startWrite()
- * - writeAckPayload()
- * - enableAckPayload()
- * - disableAckPayload()
- *
- * @param pipe Which pipe to configure. This number should be in range
- * [0, 5].
- * @param enable Whether to enable (true) or disable (false) the
- * auto-acknowledgment feature for the specified pipe
- */
- void setAutoAck(uint8_t pipe, bool enable);
-
- /**
- * Set Power Amplifier (PA) level and Low Noise Amplifier (LNA) state
- *
- * @param level The desired @ref PALevel as defined by @ref rf24_pa_dbm_e.
- * @param lnaEnable Enable or Disable the LNA (Low Noise Amplifier) Gain.
- * See table for Si24R1 modules below. @p lnaEnable only affects
- * nRF24L01 modules with an LNA chip.
- *
- * | @p level (enum value) | nRF24L01<br>description | Si24R1<br>description when<br> @p lnaEnable = 1 | Si24R1<br>description when<br> @p lnaEnable = 0 |
- * |:---------------------:|:-------:|:--------:|:-------:|
- * | @ref RF24_PA_MIN (0) | -18 dBm | -6 dBm | -12 dBm |
- * | @ref RF24_PA_LOW (1) | -12 dBm | -0 dBm | -4 dBm |
- * | @ref RF24_PA_HIGH (2) | -6 dBm | 3 dBm | 1 dBm |
- * | @ref RF24_PA_MAX (3) | 0 dBm | 7 dBm | 4 dBm |
- *
- * @note The getPALevel() function does not care what was passed @p lnaEnable parameter.
- */
- void setPALevel(uint8_t level, bool lnaEnable = 1);
-
- /**
- * Fetches the current @ref PALevel.
- *
- * @return One of the values defined by @ref rf24_pa_dbm_e.
- * See tables in @ref rf24_pa_dbm_e or setPALevel()
- */
- uint8_t getPALevel(void);
-
- /**
- * Returns automatic retransmission count (ARC_CNT)
- *
- * Value resets with each new transmission. Allows roughly estimating signal strength.
- *
- * @return Returns values from 0 to 15.
- */
- uint8_t getARC(void);
-
- /**
- * Set the transmission @ref Datarate
- *
- * @warning setting @ref RF24_250KBPS will fail for non-plus modules (when
- * isPVariant() returns false).
- *
- * @param speed Specify one of the following values (as defined by
- * @ref rf24_datarate_e):
- * | @p speed (enum value) | description |
- * |:---------------------:|:------------:|
- * | @ref RF24_1MBPS (0) | for 1 Mbps |
- * | @ref RF24_2MBPS (1) | for 2 Mbps |
- * | @ref RF24_250KBPS (2) | for 250 kbps |
- *
- * @return true if the change was successful
- */
- bool setDataRate(rf24_datarate_e speed);
-
- /**
- * Fetches the currently configured transmission @ref Datarate
- *
- * @return One of the values defined by @ref rf24_datarate_e.
- * See table in @ref rf24_datarate_e or setDataRate()
- */
- rf24_datarate_e getDataRate(void);
-
- /**
- * Set the @ref CRCLength (in bits)
- *
- * CRC cannot be disabled if auto-ack is enabled
- * @param length Specify one of the values (as defined by @ref rf24_crclength_e)
- * | @p length (enum value) | description |
- * |:--------------------------:|:------------------------------:|
- * | @ref RF24_CRC_DISABLED (0) | to disable using CRC checksums |
- * | @ref RF24_CRC_8 (1) | to use 8-bit checksums |
- * | @ref RF24_CRC_16 (2) | to use 16-bit checksums |
- */
- void setCRCLength(rf24_crclength_e length);
-
- /**
- * Get the @ref CRCLength (in bits)
- *
- * CRC checking cannot be disabled if auto-ack is enabled
- * @return One of the values defined by @ref rf24_crclength_e.
- * See table in @ref rf24_crclength_e or setCRCLength()
- */
- rf24_crclength_e getCRCLength(void);
-
- /**
- * Disable CRC validation
- *
- * @warning CRC cannot be disabled if auto-ack/ESB is enabled.
- */
- void disableCRC(void);
-
- /**
- *
- * The driver will delay for this duration when stopListening() is called
- *
- * When responding to payloads, faster devices like ARM(RPi) are much faster than Arduino:
- * 1. Arduino sends data to RPi, switches to RX mode
- * 2. The RPi receives the data, switches to TX mode and sends before the Arduino radio is in RX mode
- * 3. If AutoACK is disabled, this can be set as low as 0. If AA/ESB enabled, set to 100uS minimum on RPi
- *
- * @warning If set to 0, ensure 130uS delay after stopListening() and before any sends
- */
- uint32_t txDelay;
-
- /**
- *
- * On all devices but Linux and ATTiny, a small delay is added to the CSN toggling function
- *
- * This is intended to minimize the speed of SPI polling due to radio commands
- *
- * If using interrupts or timed requests, this can be set to 0 Default:5
- */
- uint32_t csDelay;
-
- /**
- * Transmission of constant carrier wave with defined frequency and output power
- *
- * @param level Output power to use
- * @param channel The channel to use
- *
- * @warning If isPVariant() returns true, then this function takes extra
- * measures that alter some settings. These settings alterations include:
- * - setAutoAck() to false (for all pipes)
- * - setRetries() to retry `0` times with a delay of 250 microseconds
- * - set the TX address to 5 bytes of `0xFF`
- * - flush_tx()
- * - load a 32 byte payload of `0xFF` into the TX FIFO's top level
- * - disableCRC()
- */
- void startConstCarrier(rf24_pa_dbm_e level, uint8_t channel);
-
- /**
- * Stop transmission of constant wave and reset PLL and CONT registers
- *
- * @warning this function will powerDown() the radio per recommendation of
- * datasheet.
- * @note If isPVariant() returns true, please remember to re-configure the radio's settings
- * @code
- * // re-establish default settings
- * setCRCLength(RF24_CRC_16);
- * setAutoAck(true);
- * setRetries(5, 15);
- * @endcode
- * @see startConstCarrier()
- */
- void stopConstCarrier(void);
-
- /**
- * @brief Open or close all data pipes.
- *
- * This function does not alter the addresses assigned to pipes. It is simply a
- * convenience function that allows controlling all pipes at once.
- * @param isEnabled `true` opens all pipes; `false` closes all pipes.
- */
- void toggleAllPipes(bool isEnabled);
-
- /**
- * @brief configure the RF_SETUP register in 1 transaction
- * @param level This parameter is the same input as setPALevel()'s `level` parameter.
- * See @ref rf24_pa_dbm_e enum for accepted values.
- * @param speed This parameter is the same input as setDataRate()'s `speed` parameter.
- * See @ref rf24_datarate_e enum for accepted values.
- * @param lnaEnable This optional parameter is the same as setPALevel()'s `lnaEnable`
- * optional parameter. Defaults to `true` (meaning LNA feature is enabled) when not specified.
- */
- void setRadiation(uint8_t level, rf24_datarate_e speed, bool lnaEnable = true);
-
- /**@}*/
- /**
- * @name Deprecated
- *
- * Methods provided for backwards compatibility.
- */
- /**@{*/
-
- /**
- * Open a pipe for reading
- * @deprecated For compatibility with old code only, see newer function
- * openReadingPipe().
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * @note Pipes 1-5 should share the first 32 bits.
- * Only the least significant byte should be unique, e.g.
- * @code
- * openReadingPipe(1, 0xF0F0F0F0AA);
- * openReadingPipe(2, 0xF0F0F0F066);
- * @endcode
- *
- * @warning
- * @parblock
- * Pipe 0 is also used by the writing pipe so should typically be avoided as a reading pipe.
- * If used, the reading pipe 0 address needs to be restored at every call to startListening().
- *
- * See http://maniacalbits.blogspot.com/2013/04/rf24-addressing-nrf24l01-radios-require.html
- * @endparblock
- *
- * @param number Which pipe# to open, 0-5.
- * @param address The 40-bit address of the pipe to open.
- */
- void openReadingPipe(uint8_t number, uint64_t address);
-
- /**
- * Open a pipe for writing
- * @deprecated For compatibility with old code only, see newer function
- * openWritingPipe().
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * Addresses are 40-bit hex values, e.g.:
- *
- * @code
- * openWritingPipe(0xF0F0F0F0F0);
- * @endcode
- *
- * @param address The 40-bit address of the pipe to open.
- */
- void openWritingPipe(uint64_t address);
-
- /**
- * Determine if an ack payload was received in the most recent call to
- * write(). The regular available() can also be used.
- *
- * @deprecated For compatibility with old code only, see synonymous function available().
- * Use read() to retrieve the ack payload and getDynamicPayloadSize() to get the ACK payload size.
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * @return True if an ack payload is available.
- */
- bool isAckPayloadAvailable(void);
-
- /**
- * This function is used to configure what events will trigger the Interrupt
- * Request (IRQ) pin active LOW.
- *
- * @deprecated Use setStatusFlags() instead.
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * The following events can be configured:
- * 1. "data sent": This does not mean that the data transmitted was
- * received, only that the attempt to send it was complete.
- * 2. "data failed": This means the data being sent was not received. This
- * event is only triggered when the auto-ack feature is enabled.
- * 3. "data received": This means that data from a receiving payload has
- * been loaded into the RX FIFO buffers. Remember that there are only 3
- * levels available in the RX FIFO buffers.
- *
- * By default, all events are configured to trigger the IRQ pin active LOW.
- * When the IRQ pin is active, use clearStatusFlags() or getStatusFlags() to
- * determine what events triggered it.
- * Remember that calling clearStatusFlags() also clears these
- * events' status, and the IRQ pin will then be reset to inactive HIGH.
- *
- * The following code configures the IRQ pin to only reflect the "data received"
- * event:
- * @code
- * radio.maskIRQ(1, 1, 0);
- * @endcode
- *
- * @param tx_ok `true` ignores the "data sent" event, `false` reflects the
- * "data sent" event on the IRQ pin.
- * @param tx_fail `true` ignores the "data failed" event, `false` reflects the
- * "data failed" event on the IRQ pin.
- * @param rx_ready `true` ignores the "data received" event, `false` reflects the
- * "data received" event on the IRQ pin.
- */
- void maskIRQ(bool tx_ok, bool tx_fail, bool rx_ready);
-
- /**
- * Call this when you get an Interrupt Request (IRQ) to find out why
- *
- * This function describes what event triggered the IRQ pin to go active
- * LOW and clears the status of all events.
- *
- * @deprecated Use clearStatusFlags() instead.
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * @see setStatusFlags()
- *
- * @param[out] tx_ok The transmission attempt completed (TX_DS). This does
- * not imply that the transmitted data was received by another radio, rather
- * this only reports if the attempt to send was completed. This will
- * always be `true` when the auto-ack feature is disabled.
- * @param[out] tx_fail The transmission failed to be acknowledged, meaning
- * too many retries (MAX_RT) were made while expecting an ACK packet. This
- * event is only triggered when auto-ack feature is enabled.
- * @param[out] rx_ready There is a newly received payload (RX_DR) saved to
- * RX FIFO buffers. Remember that the RX FIFO can only hold up to 3
- * payloads. Once the RX FIFO is full, all further received transmissions
- * are rejected until there is space to save new data in the RX FIFO
- * buffers.
- *
- * @note This function expects no parameters in the python wrapper.
- * Instead, this function returns a 3 item tuple describing the IRQ
- * events' status. To use this function in the python wrapper:
- * @code{.py}
- * # let`radio` be the instantiated RF24 object
- * tx_ds, tx_df, rx_dr = radio.whatHappened() # get IRQ status flags
- * print("tx_ds: {}, tx_df: {}, rx_dr: {}".format(tx_ds, tx_df, rx_dr))
- * @endcode
- */
- void whatHappened(bool& tx_ok, bool& tx_fail, bool& rx_ready);
-
- /**
- * Similar to startListening(void) but changes the TX address.
- *
- * @deprecated Use stopListening(const uint8_t*) instead.
- * See our [migration guide](migration.md) to understand what you should update in your code.
- *
- * @param txAddress The new TX address.
- * This value will be cached for auto-ack purposes.
- */
- void stopListening(const uint64_t txAddress);
-
-private:
- /**@}*/
- /**
- * @name Low-level internal interface.
- *
- * Protected methods that address the chip directly. Regular users cannot
- * ever call these. They are documented for completeness and for developers who
- * may want to extend this class.
- */
- /**@{*/
-
- /**
- * initializing function specific to all constructors
- * (regardless of constructor parameters)
- */
- void _init_obj();
-
- /**
- * initialize radio by performing a soft reset.
- * @warning This function assumes the SPI bus object's begin() method has been
- * previously called.
- */
- bool _init_radio();
-
- /**
- * initialize the GPIO pins
- */
- bool _init_pins();
-
- /**
- * Set chip select pin
- *
- * Running SPI bus at PI_CLOCK_DIV2 so we don't waste time transferring data
- * and best of all, we make use of the radio's FIFO buffers. A lower speed
- * means we're less likely to effectively leverage our FIFOs and pay a higher
- * AVR runtime cost as toll.
- *
- * @param mode HIGH to take this unit off the SPI bus, LOW to put it on
- */
- void csn(bool mode);
-
- /**
- * Write a chunk of data to a register
- *
- * @param reg Which register. Use constants from nRF24L01.h
- * @param buf Where to get the data
- * @param len How many bytes of data to transfer
- * @return Nothing. Older versions of this function returned the status
- * byte, but that it now saved to a private member on all SPI transactions.
- */
- void write_register(uint8_t reg, const uint8_t* buf, uint8_t len);
-
- /**
- * Write a single byte to a register
- *
- * @param reg Which register. Use constants from nRF24L01.h
- * @param value The new value to write
- * @return Nothing. Older versions of this function returned the status
- * byte, but that it now saved to a private member on all SPI transactions.
- */
- void write_register(uint8_t reg, uint8_t value);
-
- /**
- * Write the transmit payload
- *
- * The size of data written is the fixed payload size, see getPayloadSize()
- *
- * @param buf Where to get the data
- * @param len Number of bytes to be sent
- * @param writeType Specify if individual payload should be acknowledged
- * @return Nothing. Older versions of this function returned the status
- * byte, but that it now saved to a private member on all SPI transactions.
- */
- void write_payload(const void* buf, uint8_t len, const uint8_t writeType);
-
- /**
- * Read the receive payload
- *
- * The size of data read is the fixed payload size, see getPayloadSize()
- *
- * @param buf Where to put the data
- * @param len Maximum number of bytes to read
- * @return Nothing. Older versions of this function returned the status
- * byte, but that it now saved to a private member on all SPI transactions.
- */
- void read_payload(void* buf, uint8_t len);
-
-#if !defined(MINIMAL)
-
- /**
- * Decode and print the given 'observe_tx' value to stdout
- *
- * @param value The observe_tx value to print
- *
- * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
- */
- void print_observe_tx(uint8_t value);
-
- /**
- * Print the name and value of an 8-bit register to stdout
- *
- * Optionally it can print some quantity of successive
- * registers on the same line. This is useful for printing a group
- * of related registers on one line.
- *
- * @param name Name of the register
- * @param reg Which register. Use constants from nRF24L01.h
- * @param qty How many successive registers to print
- */
- void print_byte_register(const char* name, uint8_t reg, uint8_t qty = 1);
-
- /**
- * Print the name and value of a 40-bit address register to stdout
- *
- * Optionally it can print some quantity of successive
- * registers on the same line. This is useful for printing a group
- * of related registers on one line.
- *
- * @param name Name of the register
- * @param reg Which register. Use constants from nRF24L01.h
- * @param qty How many successive registers to print
- */
- void print_address_register(const char* name, uint8_t reg, uint8_t qty = 1);
-
- /**
- * Put the value of a 40-bit address register into a char array
- *
- * Optionally it can print some quantity of successive
- * registers on the same line. This is useful for printing a group
- * of related registers on one line.
- *
- * @param out_buffer Output buffer, char array
- * @param reg Which register. Use constants from nRF24L01.h
- * @param qty How many successive registers to print
- * @return The total number of characters written to the given buffer.
- */
- uint8_t sprintf_address_register(char* out_buffer, uint8_t reg, uint8_t qty = 1);
-#endif
-
- /**
- * Turn on or off the special features of the chip
- *
- * The chip has certain 'features' which are only available when the 'features'
- * are enabled. See the datasheet for details.
- */
- void toggle_features(void);
-
-#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
-
- void errNotify(void);
- inline int8_t errHandler(bool* doRecovery);
- inline void errHandler();
-
- bool failureFlushed;
-#endif
-
- /**
- * @brief Manipulate the @ref Datarate and txDelay
- *
- * This is a helper function to setRadiation() and setDataRate()
- * @param speed The desired data rate.
- */
- inline uint8_t _data_rate_reg_value(rf24_datarate_e speed);
-
- /**
- * @brief Manipulate the @ref PALevel
- *
- * This is a helper function to setRadiation() and setPALevel()
- * @param level The desired @ref PALevel.
- * @param lnaEnable Toggle the LNA feature.
- */
- inline uint8_t _pa_level_reg_value(uint8_t level, bool lnaEnable);
-
- /**@}*/
-};
-
-/**
- * @example{lineno} examples/GettingStarted/GettingStarted.ino
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-
-/**
- * @example{lineno} examples/AcknowledgementPayloads/AcknowledgementPayloads.ino
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with Acknowledgement (ACK) payloads attached to ACK packets.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-
-/**
- * @example{lineno} examples/ManualAcknowledgements/ManualAcknowledgements.ino
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with manually transmitted (non-automatic) Acknowledgement (ACK) payloads.
- * This example still uses ACK packets, but they have no payloads. Instead the
- * acknowledging response is sent with `write()`. This tactic allows for more
- * updated acknowledgement payload data, where actual ACK payloads' data are
- * outdated by 1 transmission because they have to loaded before receiving a
- * transmission.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-
-/**
- * @example{lineno} examples/StreamingData/StreamingData.ino
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of streaming data from 1 nRF24L01 transceiver to another.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-
-/**
- * @example{lineno} examples/MulticeiverDemo/MulticeiverDemo.ino
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from as many as 6 nRF24L01 transceivers to
- * 1 receiving transceiver. This technique is trademarked by
- * Nordic Semiconductors as "MultiCeiver".
- *
- * This example was written to be used on up to 6 devices acting as TX nodes &
- * only 1 device acting as the RX node (that's a maximum of 7 devices).
- * Use the Serial Monitor to change each node's behavior.
- */
-
-/**
- * @example{lineno} examples/InterruptConfigure/InterruptConfigure.ino
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This example uses Acknowledgement (ACK) payloads attached to ACK packets to
- * demonstrate how the nRF24L01's IRQ (Interrupt Request) pin can be
- * configured to detect when data is received, or when data has transmitted
- * successfully, or when data has failed to transmit.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-
-/**
- * @example{lineno} examples/old_backups/GettingStarted_HandlingFailures/GettingStarted_HandlingFailures.ino
- * Written by [TMRh20](http://github.com/TMRh20) in 2019
- *
- * This example demonstrates the basic getting started functionality, but with
- * failure handling for the radio chip. Addresses random radio failures etc,
- * potentially due to loose wiring on breadboards etc.
- */
-
-/**
- * @example{lineno} examples/old_backups/TransferTimeouts/TransferTimeouts.ino
- * Written by [TMRh20](https://github.com/TMRh20)
- *
- * This example demonstrates the use of and extended timeout period and
- * auto-retries/auto-reUse to increase reliability in noisy or low signal scenarios.
- *
- * Write this sketch to two different nodes. Put one of the nodes into 'transmit'
- * mode by connecting with the serial monitor and sending a 'T'. The data <br>
- * transfer will begin, with the receiver displaying the payload count and the
- * data transfer rate.
- */
-
-/**
- * @example{lineno} examples/old_backups/pingpair_irq/pingpair_irq.ino
- * Updated by [TMRh20](https://github.com/TMRh20)
- *
- * This is an example of how to user interrupts to interact with the radio, and a demonstration
- * of how to use them to sleep when receiving, and not miss any payloads.<br>
- * The pingpair_sleepy example expands on sleep functionality with a timed sleep option for the transmitter.
- * Sleep functionality is built directly into my fork of the RF24Network library<br>
- */
-
-/**
- * @example{lineno} examples/old_backups/pingpair_sleepy/pingpair_sleepy.ino
- * Updated by [TMRh20](https://github.com/TMRh20)
- *
- * This is an example of how to use the RF24 class to create a battery-
- * efficient system. It is just like the GettingStarted_CallResponse example, but the<br>
- * ping node powers down the radio and sleeps the MCU after every
- * ping/pong cycle, and the receiver sleeps between payloads. <br>
- */
-
-/**
- * @example{lineno} examples/rf24_ATTiny/rf24ping85/rf24ping85.ino
- * <b>2014 Contribution by [tong67](https://github.com/tong67)</b><br>
- * Updated 2020 by [2bndy5](http://github.com/2bndy5) for the
- * [SpenceKonde ATTinyCore](https://github.com/SpenceKonde/ATTinyCore)<br>
- * The RF24 library uses the [ATTinyCore by
- * SpenceKonde](https://github.com/SpenceKonde/ATTinyCore)
- *
- * This sketch is a duplicate of the ManualAcknowledgements.ino example
- * (without all the Serial input/output code), and it demonstrates
- * a ATTiny25/45/85 or ATTiny24/44/84 driving the nRF24L01 transceiver using
- * the RF24 class to communicate with another node.
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with manually transmitted (non-automatic) Acknowledgement (ACK) payloads.
- * This example still uses ACK packets, but they have no payloads. Instead the
- * acknowledging response is sent with `write()`. This tactic allows for more
- * updated acknowledgement payload data, where actual ACK payloads' data are
- * outdated by 1 transmission because they have to loaded before receiving a
- * transmission.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- */
-
-/**
- * @example{lineno} examples/rf24_ATTiny/timingSearch3pin/timingSearch3pin.ino
- * <b>2014 Contribution by [tong67](https://github.com/tong67)</b><br>
- * Updated 2020 by [2bndy5](http://github.com/2bndy5) for the
- * [SpenceKonde ATTinyCore](https://github.com/SpenceKonde/ATTinyCore)<br>
- * The RF24 library uses the [ATTinyCore by
- * SpenceKonde](https://github.com/SpenceKonde/ATTinyCore)
- *
- * This sketch can be used to determine the best settle time values to use for
- * RF24::csDelay in RF24::csn() (private function).
- * @see RF24::csDelay
- *
- * The settle time values used here are 100/20. However, these values depend
- * on the actual used RC combination and voltage drop by LED. The
- * intermediate results are written to TX (PB3, pin 2 -- using Serial).
- *
- * For schematic details, see introductory comment block in the rf24ping85.ino sketch.
- */
-
-/**
- * @example{lineno} examples/old_backups/pingpair_dyn/pingpair_dyn.ino
- *
- * This is an example of how to use payloads of a varying (dynamic) size on Arduino.
- */
-
-/**
- * @example{lineno} examples_linux/getting_started.py
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This is a simple example of using the RF24 class on a Raspberry Pi.
- *
- * Remember to install the [Python wrapper](python_wrapper.md), then
- * navigate to the "RF24/examples_linux" folder.
- * <br>To run this example, enter
- * @code{.sh}python3 getting_started.py @endcode and follow the prompts.
- *
- * @note this example requires python v3.7 or newer because it measures
- * transmission time with `time.monotonic_ns()`.
- */
-
-/**
- * @example{lineno} examples_linux/acknowledgement_payloads.py
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This is a simple example of using the RF24 class on a Raspberry Pi to
- * transmit and retrieve custom automatic acknowledgment payloads.
- *
- * Remember to install the [Python wrapper](python_wrapper.md), then
- * navigate to the "RF24/examples_linux" folder.
- * <br>To run this example, enter
- * @code{.sh}python3 acknowledgement_payloads.py @endcode and follow the prompts.
- *
- * @note this example requires python v3.7 or newer because it measures
- * transmission time with `time.monotonic_ns()`.
- */
-
-/**
- * @example{lineno} examples_linux/manual_acknowledgements.py
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This is a simple example of using the RF24 class on a Raspberry Pi to
- * transmit and respond with acknowledgment (ACK) transmissions. Notice that
- * the auto-ack feature is enabled, but this example doesn't use automatic ACK
- * payloads because automatic ACK payloads' data will always be outdated by 1
- * transmission. Instead, this example uses a call and response paradigm.
- *
- * Remember to install the [Python wrapper](python_wrapper.md), then
- * navigate to the "RF24/examples_linux" folder.
- * <br>To run this example, enter
- * @code{.sh}python3 manual_acknowledgements.py @endcode and follow the prompts.
- *
- * @note this example requires python v3.7 or newer because it measures
- * transmission time with `time.monotonic_ns()`.
- */
-
-/**
- * @example{lineno} examples_linux/streaming_data.py
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This is a simple example of using the RF24 class on a Raspberry Pi for
- * streaming multiple payloads.
- *
- * Remember to install the [Python wrapper](python_wrapper.md), then
- * navigate to the "RF24/examples_linux" folder.
- * <br>To run this example, enter
- * @code{.sh}python3 streaming_data.py @endcode and follow the prompts.
- *
- * @note this example requires python v3.7 or newer because it measures
- * transmission time with `time.monotonic_ns()`.
- */
-
-/**
- * @example{lineno} examples_linux/interrupt_configure.py
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This is a simple example of using the RF24 class on a Raspberry Pi to
- * detecting (and verifying) the IRQ (interrupt) pin on the nRF24L01.
- *
- * Remember to install the [Python wrapper](python_wrapper.md), then
- * navigate to the "RF24/examples_linux" folder.
- * <br>To run this example, enter
- * @code{.sh}python3 interrupt_configure.py @endcode and follow the prompts.
- *
- * @note this example requires python v3.7 or newer because it measures
- * transmission time with `time.monotonic_ns()`.
- */
-
-/**
- * @example{lineno} examples_linux/multiceiver_demo.py
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * This is a simple example of using the RF24 class on a Raspberry Pi for
- * using 1 nRF24L01 to receive data from up to 6 other transceivers. This
- * technique is called "multiceiver" in the datasheet.
- *
- * Remember to install the [Python wrapper](python_wrapper.md), then
- * navigate to the "RF24/examples_linux" folder.
- * <br>To run this example, enter
- * @code{.sh}python3 multiceiver_demo.py @endcode and follow the prompts.
- *
- * @note this example requires python v3.7 or newer because it measures
- * transmission time with `time.monotonic_ns()`.
- */
-
-/**
- * @example{lineno} examples_linux/scanner.cpp
- *
- * Example to detect interference on the various channels available.
- * This is a good diagnostic tool to check whether you're picking a
- * good channel for your application.
- *
- * Inspired by cpixip.
- * See http://arduino.cc/forum/index.php/topic,54795.0.html
- *
- * Use ctrl+C to exit
- */
-
-/**
- * @example{lineno} examples/scanner/scanner.ino
- *
- * Example to detect interference on the various channels available.
- * This is a good diagnostic tool to check whether you're picking a
- * good channel for your application.
- *
- * Inspired by cpixip.
- * See http://arduino.cc/forum/index.php/topic,54795.0.html
- */
-
-/**
- * @example{lineno} examples_linux/gettingstarted.cpp
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another.
- *
- * This example was written * This example was written to be used on up to 6 devices acting as TX nodes &
- * only 1 device acting as the RX node (that's a maximum of 7 devices).
- acting as "nodes".
- * Use `ctrl+c` to quit at any time.
- */
-
-/**
- * @example{lineno} examples_linux/acknowledgementPayloads.cpp
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with Acknowledgement (ACK) payloads attached to ACK packets.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use `ctrl+c` to quit at any time.
- */
-
-/**
- * @example{lineno} examples_linux/manualAcknowledgements.cpp
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with manually transmitted (non-automatic) Acknowledgement (ACK) payloads.
- * This example still uses ACK packets, but they have no payloads. Instead the
- * acknowledging response is sent with `write()`. This tactic allows for more
- * updated acknowledgement payload data, where actual ACK payloads' data are
- * outdated by 1 transmission because they have to loaded before receiving a
- * transmission.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use `ctrl+c` to quit at any time.
- */
-
-/**
- * @example{lineno} examples_linux/streamingData.cpp
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use `ctrl+c` to quit at any time.
- */
-
-/**
- * @example{lineno} examples_linux/multiceiverDemo.cpp
- * Written by [2bndy5](http://github.com/2bndy5) in 2020
- *
- * A simple example of sending data from as many as 6 nRF24L01 transceivers to
- * 1 receiving transceiver. This technique is trademarked by
- * Nordic Semiconductors as "MultiCeiver".
- *
- * This example was written to be used on up to 6 devices acting as TX nodes &
- * only 1 device acting as the RX node (that's a maximum of 7 devices).
- * Use `ctrl+c` to quit at any time.
- */
-
-#endif // RF24_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/RF24_config.h b/.pio/libdeps/esp32-s3-n16r8/RF24/RF24_config.h
deleted file mode 100644
index c06429c..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/RF24_config.h
+++ /dev/null
@@ -1,248 +0,0 @@
-
-/*
- Copyright (C)
- 2011 J. Coliz <maniacbug@ymail.com>
- 2015-2019 TMRh20
- 2015 spaniakos <spaniakos@gmail.com>
- 2015 nerdralph
- 2015 zador-blood-stained
- 2016 akatran
- 2017-2019 Avamander <avamander@gmail.com>
- 2019 IkpeohaGodson
- 2021 2bndy5
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-*/
-
-#ifndef RF24_CONFIG_H_
-#define RF24_CONFIG_H_
-
-/*** USER DEFINES: ***/
-#define FAILURE_HANDLING
-//#define RF24_DEBUG
-//#define MINIMAL
-//#define SPI_UART // Requires library from https://github.com/TMRh20/Sketches/tree/master/SPI_UART
-//#define SOFTSPI // Requires library from https://github.com/greiman/DigitalIO
-
-/**
- * User access to internally used delay time (in microseconds) during RF24::powerUp()
- * @warning This default value compensates for all supported hardware. Only adjust this if you
- * know your radio's hardware is, in fact, genuine and reliable.
- */
-#if !defined(RF24_POWERUP_DELAY)
- #define RF24_POWERUP_DELAY 5000
-#endif
-
-/**********************/
-#define rf24_max(a, b) ((a) > (b) ? (a) : (b))
-#define rf24_min(a, b) ((a) < (b) ? (a) : (b))
-
-/** @brief The default SPI speed (in Hz) */
-#ifndef RF24_SPI_SPEED
- #define RF24_SPI_SPEED 10000000
-#endif
-
-//ATXMega
-#if defined(__AVR_ATxmega64D3__) || defined(__AVR_ATxmega128D3__) || defined(__AVR_ATxmega192D3__) || defined(__AVR_ATxmega256D3__) || defined(__AVR_ATxmega384D3__)
- // In order to be available both in Windows and Linux this should take presence here.
- #define XMEGA
- #define XMEGA_D3
- #include "utility/ATXMegaD3/RF24_arch_config.h"
-
-// RaspberryPi rp2xxx-based devices (e.g. RPi Pico board)
-#elif defined(PICO_BUILD) && !defined(ARDUINO)
- #include "utility/rp2/RF24_arch_config.h"
- #define sprintf_P sprintf
-
-#elif (!defined(ARDUINO)) // Any non-arduino device is handled via configure/Makefile
- // The configure script detects device and copies the correct includes.h file to /utility/includes.h
- // This behavior can be overridden by calling configure with respective parameters
- // The includes.h file defines either RF24_RPi, MRAA, LITTLEWIRE or RF24_SPIDEV and includes the correct RF24_arch_config.h file
- #include "utility/includes.h"
-
- #ifndef sprintf_P
- #define sprintf_P sprintf
- #endif // sprintf_P
-
-//ATTiny
-#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__) || defined(__AVR_ATtiny861__) || defined(__AVR_ATtinyX5__) || defined(__AVR_ATtinyX4__) || defined(__AVR_ATtinyX313__) || defined(__AVR_ATtinyX61__)
- #define RF24_TINY
- #include "utility/ATTiny/RF24_arch_config.h"
-
-#elif defined(LITTLEWIRE) //LittleWire
- #include "utility/LittleWire/RF24_arch_config.h"
-
-#elif defined(TEENSYDUINO) //Teensy
- #include "utility/Teensy/RF24_arch_config.h"
-
-#else //Everything else
- #include <Arduino.h>
-
- #ifdef NUM_DIGITAL_PINS
- #if NUM_DIGITAL_PINS < 255
-typedef uint8_t rf24_gpio_pin_t;
- #define RF24_PIN_INVALID 0xFF
- #else
-typedef uint16_t rf24_gpio_pin_t;
- #define RF24_PIN_INVALID 0xFFFF
- #endif
- #else
-typedef uint16_t rf24_gpio_pin_t;
- #define RF24_PIN_INVALID 0xFFFF
- #endif
-
- #if defined(ARDUINO_NRF54L15)
- #define sprintf_P sprintf
- #endif
-
- #if defined(ARDUINO) && !defined(__arm__) && !defined(__ARDUINO_X86__)
- #if defined SPI_UART
- #include <SPI_UART.h>
- #define _SPI uspi
- #elif defined(SOFTSPI)
- // change these pins to your liking
- //
- #ifndef SOFT_SPI_MISO_PIN
- #define SOFT_SPI_MISO_PIN 9
- #endif // SOFT_SPI_MISO_PIN
-
- #ifndef SOFT_SPI_MOSI_PIN
- #define SOFT_SPI_MOSI_PIN 8
- #endif // SOFT_SPI_MOSI_PIN
-
- #ifndef SOFT_SPI_SCK_PIN
- #define SOFT_SPI_SCK_PIN 7
- #endif // SOFT_SPI_SCK_PIN
-
-const uint8_t SPI_MODE = 0;
- #define _SPI spi
-
- #elif defined(ARDUINO_SAM_DUE)
- #include <SPI.h>
- #define _SPI SPI
-
- #else // !defined (SPI_UART) && !defined (SOFTSPI)
- #include <SPI.h>
- #define _SPI SPIClass
- #define RF24_SPI_PTR
- #endif // !defined (SPI_UART) && !defined (SOFTSPI)
-
- #else // !defined(ARDUINO) || defined (__arm__) || defined (__ARDUINO_X86__)
- // Define _BV for non-Arduino platforms and for Arduino DUE
- #include <stdint.h>
- #include <stdio.h>
- #include <string.h>
-
- #if defined(__arm__) || defined(__ARDUINO_X86__)
- #if defined(__arm__) && defined(SPI_UART)
- #include <SPI_UART.h>
- #define _SPI uspi
-
- #else // !defined (__arm__) || !defined (SPI_UART)
- #include <SPI.h>
- #define _SPI SPIClass
- #define RF24_SPI_PTR
-
- #endif // !defined (__arm__) || !defined (SPI_UART)
- #elif !defined(__arm__) && !defined(__ARDUINO_X86__)
-// fallback to unofficially supported Hardware (courtesy of ManiacBug)
-extern HardwareSPI SPI;
- #define _SPI HardwareSPI
- #define RF24_SPI_PTR
-
- #endif // !defined(__arm__) && !defined (__ARDUINO_X86__)
-
- #ifndef _BV
- #define _BV(x) (1 << (x))
- #endif
- #endif // defined (ARDUINO) && !defined (__arm__) && !defined (__ARDUINO_X86__)
-
- #ifdef RF24_DEBUG
- #define IF_RF24_DEBUG(x) ({ x; })
- #else
- #define IF_RF24_DEBUG(x)
- #if defined(RF24_TINY)
- #define printf_P(...)
- #endif // defined(RF24_TINY)
-
- #endif // RF24_DEBUG
-
- #if defined(__ARDUINO_X86__)
- #define printf_P printf
- #define _BV(bit) (1 << (bit))
-
- #endif // defined (__ARDUINO_X86__)
-
- // Progmem is Arduino-specific
- #if defined(ARDUINO_ARCH_ESP8266) || defined(ESP32) || (defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED))
- #include <pgmspace.h>
- #define PRIPSTR "%s"
- #ifndef pgm_read_ptr
- #define pgm_read_ptr(p) (*(void* const*)(p))
- #endif
- // Serial.printf() is no longer defined in the unifying Arduino/ArduinoCore-API repo
- // Serial.printf() is defined if using the arduino-pico/esp32/8266 repo
- #if defined(ARDUINO_ARCH_ESP32) // do not `undef` when using the espressif SDK only
- #undef printf_P // needed for ESP32 core
- #endif
- #define printf_P Serial.printf
- #elif defined(ARDUINO) && !defined(ESP_PLATFORM) && !defined(__arm__) && !defined(__ARDUINO_X86__) || defined(XMEGA)
- #include <avr/pgmspace.h>
- #define PRIPSTR "%S"
-
- #else // !defined (ARDUINO) || defined (ESP_PLATFORM) || defined (__arm__) || defined (__ARDUINO_X86__) && !defined (XMEGA)
- #if !defined(ARDUINO) // This doesn't work on Arduino DUE
-typedef char const char;
- #else // Fill in pgm_read_byte that is used
- #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_SAM_DUE)
- #include <avr/pgmspace.h> // added to ArduinoCore-sam (Due core) in 2013
- #endif
-
- // Since the official arduino/ArduinoCore-samd repo switched to a unified API in 2016,
- // Serial.printf() is no longer defined in the unifying Arduino/ArduinoCore-API repo
- #if defined(ARDUINO_ARCH_SAMD) && defined(ARDUINO_SAMD_ADAFRUIT)
- // it is defined if using the adafruit/ArduinoCore-samd repo
- #define printf_P Serial.printf
- #endif // defined (ARDUINO_ARCH_SAMD)
-
- #ifndef pgm_read_byte
- #define pgm_read_byte(addr) (*(const unsigned char*)(addr))
- #endif
- #endif // !defined (ARDUINO)
-
- #ifndef prog_uint16_t
-typedef uint16_t prog_uint16_t;
- #endif
- #ifndef PSTR
- #define PSTR(x) (x)
- #endif
- #ifndef printf_P
- #define printf_P printf
- #endif
- #ifndef strlen_P
- #define strlen_P strlen
- #endif
- #ifndef PROGMEM
- #define PROGMEM
- #endif
- #ifndef pgm_read_word
- #define pgm_read_word(p) (*(const unsigned short*)(p))
- #endif
- #if !defined pgm_read_ptr || defined ARDUINO_ARCH_MBED
- #define pgm_read_ptr(p) (*(void* const*)(p))
- #endif
- #ifndef PRIPSTR
- #define PRIPSTR "%s"
- #endif
-
- #endif // !defined (ARDUINO) || defined (ESP_PLATFORM) || defined (__arm__) || defined (__ARDUINO_X86__) && !defined (XMEGA)
-
-#endif //Everything else
-
-#if defined(SPI_HAS_TRANSACTION) && !defined(SPI_UART) && !defined(SOFTSPI)
- #define RF24_SPI_TRANSACTIONS
-#endif // defined (SPI_HAS_TRANSACTION) && !defined (SPI_UART) && !defined (SOFTSPI)
-
-#endif // RF24_CONFIG_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/cspell.config.yaml b/.pio/libdeps/esp32-s3-n16r8/RF24/cspell.config.yaml
deleted file mode 100644
index 912d68d..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/cspell.config.yaml
+++ /dev/null
@@ -1,319 +0,0 @@
-version: "0.2"
-language: en
-words:
- - aarch
- - abled
- - Achstetter
- - ADAFRUIT
- - addch
- - addstr
- - afen
- - akatran
- - apidoc
- - Arduipi
- - AREF
- - argparser
- - armhf
- - armv
- - Atmel
- - atmelavr
- - atmelmegaavr
- - atmelsam
- - ATSAMD
- - ATTINY
- - attroff
- - attron
- - ATXMEGA
- - ATXMEGAD
- - autosectionlabel
- - Avamander
- - bdist
- - berryfied
- - blogspot
- - bndy
- - bootloader
- - BPLUS
- - bufptr
- - bugprone
- - bysource
- - bytearray
- - calcsize
- - cbps
- - cbreak
- - ccache
- - ccmake
- - cepin
- - CFLAGS
- - CHIPINFO
- - CLANGTIDY
- - classname
- - CLKSEL
- - codecov
- - Coliz
- - cond
- - Configurators
- - cpack
- - CPHA
- - cpixip
- - CPPCHECK
- - cppreference
- - CPUFLAGS
- - crclength
- - CRCO
- - CROSSCOMPILING
- - crossunix
- - crossunixccompiler
- - cspin
- - cstdio
- - CTRLA
- - CTRLB
- - datarate
- - datasheet
- - Datasheets
- - DBUILDSWIGNODE
- - DCMAKE
- - DEFAULTPINS
- - deinit
- - DIRCLR
- - DIRSET
- - Disabl
- - Doherty
- - Doxyfile
- - doxygen
- - doxygenfile
- - doxygenfunction
- - doxygengroup
- - doxygenpage
- - doxygenvariable
- - DPICO
- - dpkg
- - DSOFT
- - DSOFTSPI
- - dstroy
- - DYNPD
- - ENAA
- - endforeach
- - endfunction
- - endparblock
- - endverbatim
- - endwin
- - Engelke
- - enumvalue
- - espressif
- - Fals
- - farconada
- - fdevopen
- - FETCHCONTENT
- - fsanitize
- - fsel
- - fstack
- - ftime
- - genindex
- - gettingstarted
- - gnueabihf
- - gnux
- - GPIO
- - gpiochip
- - gpiod
- - Gunasekara
- - Hallard
- - HCURR
- - HILVLEN
- - HLINE
- - HMISO
- - HMOSI
- - HSCLK
- - hspi
- - Ikpeoha
- - imgui
- - INPT
- - INTCTRL
- - INTCTRLA
- - Interprocedural
- - intersphinx
- - iomanip
- - ITSYBITSY
- - Jannis
- - Jetson
- - jscrane
- - KBPS
- - Konde
- - kripton
- - ldconfig
- - ldiaz
- - libboost
- - libc
- - libgpiod
- - libmaple
- - libncurses
- - librf
- - linaro
- - linenos
- - literalinclude
- - LITTLEWIRE
- - LOLVLEN
- - lossiness
- - LPSTR
- - LPWSTR
- - lsbmode
- - lwiring
- - Makefiles
- - Maniacbug
- - markdownlint
- - marm
- - MBED
- - MBPS
- - MCUSR
- - MEDLVLEN
- - MEGAAVR
- - mfloat
- - mfpu
- - microcontroller
- - milisec
- - millis
- - milliwatts
- - MOSI
- - MRAA
- - MSBFIRST
- - MSVC
- - mtune
- - Multiceiver
- - mypy
- - nerdralph
- - newlib
- - nocbreak
- - noecho
- - nullptr
- - Ofast
- - OLED
- - OUTCLR
- - OVFINTLVL
- - parblock
- - Pastore
- - pgmspace
- - PICO
- - PIGPIO
- - PIMORONI
- - PINB
- - pingpair
- - pinout
- - pkgs
- - PLOS
- - PMIC
- - PORTA
- - PORTB
- - PORTC
- - PORTD
- - Portenta
- - PORTF
- - postargs
- - postinst
- - postrm
- - POWERUP
- - preargs
- - premain
- - prescalar
- - Prescaler
- - println
- - PRIPSTR
- - PROGMEM
- - pthread
- - purinda
- - pypi
- - pyproject
- - QTPY
- - Quigg
- - raspi
- - REALPATH
- - rpmbuild
- - RXADDR
- - rxbuff
- - SAMD
- - sccache
- - sclk
- - seealso
- - Seow
- - SERCOM
- - setuptools
- - SOFTSPI
- - SOVERSION
- - spaniakos
- - SPARFUN
- - Sparkfun
- - Speedz
- - SPID
- - spidev
- - SPIUART
- - sprintf
- - stanleyseow
- - stby
- - stddef
- - stdlib
- - STREQUAL
- - strresult
- - ststm
- - sunxi
- - suppr
- - SWITCHCAPVCC
- - sysroot
- - tableofcontents
- - TEENSYDUINO
- - THINGPLUS
- - timeit
- - toctree
- - TOLOWER
- - transfern
- - transfernb
- - txbuff
- - UART
- - undoc
- - unexport
- - userspace
- - uspi
- - vect
- - venv
- - vfpv
- - virtualenv
- - vpfv
- - VSPI
- - Wcast
- - Wconversion
- - WDCE
- - WDIE
- - Wdouble
- - WDRF
- - wdtcsr
- - Wduplicated
- - Werror
- - Wextra
- - Wformat
- - WGMODE
- - WIRINGPI
- - Wlogical
- - Wmisleading
- - Wnon
- - Wnull
- - Woverloaded
- - Wpedantic
- - Wshadow
- - Wsign
- - Wunused
- - Wuseless
- - XMEGA
- - Yagarto
- - zador
-ignorePaths:
- - .env/**
- - .venv/**
- - env/**
- - venv/**
- - "**.clang-tidy"
- - "**.clang-format"
- - .gitignore
- - "**/*.{yml,yaml}"
- - utility/RPi/bcm2835.*
- - Makefile*
- - make.bat
- - Doxyfile
- - configure
- - CHANGELOG.md
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/Doxyfile b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/Doxyfile
deleted file mode 100644
index ec19193..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/Doxyfile
+++ /dev/null
@@ -1,393 +0,0 @@
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-PROJECT_ICON = images/favicon.ico
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
-PROJECT_NAME = "Optimized high speed nRF24L01+ driver class documentation"
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF = "TMRh20 2020 - Optimized fork of the nRF24L01+ driver"
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = ./
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand part
-# of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to strip.
-# Note that you can specify absolute paths here, but also relative paths, which will
-# be relative from the directory where doxygen is started.
-#
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-STRIP_FROM_PATH = ../
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
-# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
-# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
-# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
-# tries to guess whether the code is fixed or free formatted code, this is the
-# default for Fortran type files). For instance to make doxygen treat .inc files
-# as Fortran files (default is PHP), and .f files as C (default is Fortran),
-# use: inc=Fortran f=C.
-#
-# Note: For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
-EXTENSION_MAPPING = ino=c \
- pde=c
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
-EXTRACT_STATIC = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# (including Cygwin) ands Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
-CASE_SENSE_NAMES = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order.
-# The default value is: YES.
-
-SORT_MEMBER_DOCS = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
-SORT_BY_SCOPE_NAME = YES
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
-# list. This list is created by putting \todo commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TODOLIST = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
-SHOW_NAMESPACES = NO
-
-# Don't display the ugly/complicated "tree view" side menu.
-# And, restore the top (simpler) navigation bar.
-# As of doxygen v1.13.0, these default values changed from NO to YES
-GENERATE_TREEVIEW = NO
-DISABLE_INDEX = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
-# The default value is: NO.
-
-WARN_AS_ERROR = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
-# Note: If this tag is empty the current directory is searched.
-
-INPUT = ../ \
- ../utility/Template \
- ./
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
-#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
-# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
-# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
-# *.vhdl, *.ucf, *.qsf and *.ice.
-
-FILE_PATTERNS = *.c \
- *.cc \
- *.cxx \
- *.cpp \
- *.c++ \
- *.java \
- *.ii \
- *.ixx \
- *.ipp \
- *.i++ \
- *.inl \
- *.idl \
- *.ddl \
- *.odl \
- *.h \
- *.hh \
- *.hxx \
- *.hpp \
- *.h++ \
- *.cs \
- *.d \
- *.php \
- *.php4 \
- *.php5 \
- *.phtml \
- *.inc \
- *.m \
- *.markdown \
- *.md \
- *.mm \
- *.dox \
- *.py \
- *.f90 \
- *.f \
- *.for \
- *.tcl \
- *.vhd \
- *.vhdl \
- *.ucf \
- *.qsf \
- *.as \
- *.js
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE = Makefile \
- configure
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
-EXCLUDE_PATTERNS = bcm2835* \
- readme* \
- runtest* \
- tests* \
- README*
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS = _
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
-EXAMPLE_PATH = ../examples \
- ../examples_linux
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
-EXAMPLE_PATTERNS =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
-EXAMPLE_RECURSIVE = YES
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
-IMAGE_PATH = ../images
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE = main_page.md
-
-#---------------------------------------------------------------------------
-# Configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
-SOURCE_BROWSER = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefore more robust against future updates.
-# Doxygen will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_STYLESHEET = doxygen-custom.css
-
-# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output should be rendered
-# with a dark or light theme.
-#
-# Possible values are:
-# - LIGHT always generate light mode output
-# - DARK always generate dark mode output
-# - AUTO_LIGHT automatically set the mode according to the user preference,
-# use light mode if no preference is set (the default)
-# - AUTO_DARK automatically set the mode according to the user preference,
-# use dark mode if no preference is set
-# - TOGGLE allow to user to switch between light and dark mode via a button.
-#
-# The default value is: AUTO_LIGHT.
-#
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE = TOGGLE
-
-# If the TIMESTAMP tag is set different from NO then each generated page will contain
-# the date or date and time when the page was generated. Setting this to NO can help
-# when comparing the output of multiple runs.
-#
-# Possible values are: YES, NO, DATETIME and DATE.
-#
-# The default value is: NO.
-
-TIMESTAMP = DATE
-
-# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
-# documentation will contain a main index with vertical navigation menus that
-# are dynamically created via JavaScript. If disabled, the navigation index will
-# consists of multiple levels of tabs that are statically embedded in every HTML
-# page. Disable this option to support browsers that do not have JavaScript,
-# like the Qt help browser.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_MENUS = NO
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_SECTIONS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
-# The default value is: YES.
-
-GENERATE_LATEX = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-PREDEFINED = DOXYGEN_FORCED
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/README.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/README.md
deleted file mode 100644
index 935c171..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Please browse the docs from either http://nrf24.github.io/RF24
-
-## Intended for use in Doxygen
-
-The markdown files (\*.md) in this docs folder contain relative hyperlinks. Any relative hyperlinks will not work when viewing these markdown files in github.
-
-----
-
-## Building the docs
-
-Navigate to the repo's docs folder:
-
-```shell
-cd docs
-```
-
-Install Doxygen (v1.12.0 or newer) and run the following command from the repo's docs folder:
-
-```shell
-doxygen
-```
-
-The Doxygen HTML output is now in docs/html.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/arduino.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/arduino.md
deleted file mode 100644
index a1068b4..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/arduino.md
+++ /dev/null
@@ -1,288 +0,0 @@
-# Arduino
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 -->
-RF24 is fully compatible with Arduino boards.
-
-See [Arduino Board reference](http://www.arduino.cc/en/Reference/Board) and [Arduino SPI reference](http://arduino.cc/en/Reference/SPI) for more information
-
-RF24 makes use of the standard hardware SPI pins (MISO, MOSI, SCK) and requires two additional pins, to control
-the chip-select and chip-enable functions.
-
-```cpp
-RF24 radio(ce_pin, cs_pin);
-```
-
-These pins must be chosen and designated by the user and can use any
-available pins.
-
-## Alternate SPI Support
-
-RF24 supports alternate SPI methods, in case the standard hardware SPI pins are otherwise unavailable.
-
-### Software Driven SPI
-
-Software driven SPI is provided by the [DigitalIO library](https://github.com/greiman/DigitalIO).
-
-Setup:
-
-1. Install the digitalIO library
-2. Open RF24_config.h in a text editor.
- Uncomment the line
- ```cpp
- #define SOFTSPI
- ```
- or add the build flag/option
- ```shell
- -DSOFTSPI
- ```
-3. In your sketch, add
- ```cpp
- #include <DigitalIO.h>
- ```
-
-@note Note: Pins are listed as follows and can be modified by editing the RF24_config.h file.
-
-```cpp
-#define SOFT_SPI_MISO_PIN 16
-#define SOFT_SPI_MOSI_PIN 15
-#define SOFT_SPI_SCK_PIN 14
-```
-
-Or add the build flag/option
-
-```shell
--DSOFT_SPI_MISO_PIN=16 -DSOFT_SPI_MOSI_PIN=15 -DSOFT_SPI_SCK_PIN=14
-```
-
-### Alternate Hardware (UART) Driven SPI
-
-The Serial Port (UART) on Arduino can also function in SPI mode, and can double-buffer data, while the
-default SPI hardware cannot.
-
-The SPI_UART library is available at [TMRh20/Sketches](https://github.com/TMRh20/Sketches/tree/master/SPI_UART)
-
-Enabling:
-
-1. Install the SPI_UART library
-2. Edit RF24_config.h and uncomment
- ```cpp
- #define SPI_UART
- ```
-3. In your sketch, add
- ```cpp
- #include <SPI_UART.h>
- ```
-
-SPI_UART SPI Pin Connections:
-| NRF |Arduino Uno Pin|
-|----:|:--------------|
-| MOSI| TX(0) |
-| MISO| RX(1) |
-| SCK | XCK(4) |
-| CE | User Specified|
-| CSN | User Specified|
-
-@note SPI_UART on Mega boards requires soldering to an unused pin on the chip. See [#24](https://github.com/TMRh20/RF24/issues/24) for more information on SPI_UART.
-
-### Using a specific SPI Bus
-
-An alternate SPI bus can be specified using the overloaded `RF24::begin(_SPI*)` method.
-This is useful for some boards that offer more than 1 hardware-driven SPI bus or certain Arduino
-cores that implement a software-driven (AKA bit-banged) SPI bus that does not use the DigitalIO
-library.
-
-@warning The SPI bus object's `SPIClass::begin()` method **must** be called before
-calling the overloaded `RF24::begin(_SPI*)` method.
-
-Below are some example snippets that demonstrate how this can be done.
-
-#### ESP8266 example
-
-@see The following example code is meant for the popular NodeMCU board. Please refer to the
-[ESP8266 ArduinoCore's SPI documentation](https://arduino-esp8266.readthedocs.io/en/latest/libraries.html#spi)
-for [other ESP8266-based boards](https://arduino-esp8266.readthedocs.io/en/latest/boards.html#).
-
-```cpp
-#include <SPI.h>
-#include <RF24.h>
-
-// notice these pin numbers are not the same used in the library examples
-RF24 radio(D4, D3); // the (ce_pin, csn_pin) connected to the radio
-
-void setup() {
- Serial.begin(115200);
- while (!Serial) {} //some boards need this
-
- // by default (with no arguments passed) SPI uses D5 (HSCLK), D6 (HMISO), D7 (HMOSI)
- SPI.pins(6, 7, 8, 0);
- // this means the following pins are used for the SPI bus:
- // MOSI = SD1
- // MISO = SD0
- // SCLK = CLK
- // CSN = GPIO0 (labeled D3 on the board)
- // **notice we also passed `D3` to the RF24 constructor's csn_pin parameter**
-
- SPI.begin();
-
- if (!radio.begin(&SPI)) {
- Serial.println(F("radio hardware not responding!!"));
- while (1) {} // hold program in infinite loop to prevent subsequent errors
- }
-
- // ... continue with program as normal (see library examples/ folder)
-}
-```
-
-#### ESP32 example
-
-@see Please review the Espressif's
-[SPI_Multiple_Buses.ino example for the ESP32](https://github.com/espressif/arduino-esp32/blob/master/libraries/SPI/examples/SPI_Multiple_Buses/SPI_Multiple_Buses.ino)
-located in their ArduinoCore repository (along with the SPI library for the ESP32).
-
-```cpp
-#include <SPI.h>
-#include <RF24.h>
-
-// to use custom-defined pins, uncomment the following
-// #define MY_MISO 26
-// #define MY_MOSI 27
-// #define MY_SCLK 25
-// #define MY_SS 32 // pass MY_SS as the csn_pin parameter to the RF24 constructor
-
-// notice these pin numbers are not the same used in the library examples
-RF24 radio(2, 0); // the (ce_pin, csn_pin) connected to the radio
-
-SPIClass* hspi = nullptr; // we'll instantiate this in the `setup()` function
-// by default the HSPI bus pre-defines the following pins
-// HSPI_MISO = 12
-// HSPI_MOSI = 13
-// HSPI_SCLK = 14
-// HSPI_SS = 15
-
-void setup() {
- Serial.begin(115200);
- while (!Serial) {} //some boards need this
-
- hspi = new SPIClass(HSPI); // by default VSPI is used
- hspi->begin();
- // to use the custom defined pins, uncomment the following
- // hspi->begin(MY_SCLK, MY_MISO, MY_MOSI, MY_SS)
-
- if (!radio.begin(hspi)) {
- Serial.println(F("radio hardware not responding!!"));
- while (1) {} // hold program in infinite loop to prevent subsequent errors
- }
-
- // ... continue with program as normal (see library examples/ folder)
-}
-```
-
-#### Teensy example
-
-@see The overloaded RF24::begin(\_SPI\*) is not needed according to the
-[Teensyduino SPI documentation](https://www.pjrc.com/teensy/td_libs_SPI.html).
-Please review the table provided in the
-[Teensyduino documentation](https://www.pjrc.com/teensy/td_libs_SPI.html) for what pins are used by
-default for certain Teensy boards.
-
-```cpp
-#include <SPI.h>
-#include <RF24.h>
-
-// these pins are the alternate SPI pins available for Teensy LC/3.0/3.1/3.2/3.5/3.6
-#define MY_MISO 8
-#define MY_MOSI 7
-#define MY_SCLK 14
-
-// notice these pin numbers are not the same used in the library examples
-RF24 radio(2, 0); // the (ce_pin, csn_pin) connected to the radio
-
-void setup() {
- Serial.begin(115200);
- while (!Serial) {} //some boards need this
-
- SPI.setMOSI(MY_MOSI);
- SPI.setMISO(MY_MISO);
- SPI.setSCK(MY_SCLK);
-
- if (!radio.begin()) {
- Serial.println(F("radio hardware not responding!!"));
- while (1) {} // hold program in infinite loop to prevent subsequent errors
- }
-
- // ... continue with program as normal (see library examples/ folder)
-}
-```
-
-<!--
-#### MBED example
-@see The [ArduinoCore-mbed SPI library](https://github.com/arduino/ArduinoCore-mbed/tree/master/libraries/SPI)
-has predefined the possible hardware-driven SPI buses. This applies to Arduino Nano 33 BLE and
-Arduino Portenta boards.
-
-```cpp
-#include <SPI.h>
-#include <RF24.h>
-
-RF24 radio(7, 8); // the (ce_pin, csn_pin) connected to the radio
-
-void setup() {
- Serial.begin(115200);
- while (!Serial) {} //some boards need this
-
- SPI1.begin();
-
- if (!radio.begin(&SPI1)) {
- Serial.println(F("radio hardware not responding!!"));
- while (1) {} // hold program in infinite loop to prevent subsequent errors
- }
-
- // ... continue with program as normal (see library examples/ folder)
-}
-```
-
-#### ATSAMD21 example
-@see The Support for secondary SPI bus on ATSAMD21 chips is scarcely documented. However,
-[Sparkfun has a tutorial about using a second SPI bus](https://learn.sparkfun.com/tutorials/adding-more-sercom-ports-for-samd-boards/adding-an-spi)
-that often refers to the
-[ArduinoCore-samd SPI library source code](https://github.com/arduino/ArduinoCore-samd/blob/master/libraries/SPI/SPI.h). This example applies Sparkfun's tutorial toward the RF24 library.
-Special thanks to [ex-caliper](https://github.com/ex-caliper) for the lead!
-
-```cpp
-#include <SPI.h>
-#include <RF24.h>
-#include "wiring_private.h" // pinPeripheral()
-
-// Define the pins are the alternate SPI pins we will use. These pin numbers ARE NOT chosen at random.
-// The Sparkfun tutorial explains these choices in more detail (link is in "See Also" comment above).
-#define MY_MISO 3
-#define MY_MOSI 4
-#define MY_SCLK 5
-
-// instantiate the secondary SPI bus
-SPIClass MY_SPI(&sercom2, MY_MISO, MY_SCLK, MY_MOSI, SPI_PAD_0_SCK_3, SERCOM_RX_PAD_1);
-
-// notice these pin numbers are not the same used in the library examples
-RF24 radio(7, 6); // the (ce_pin, csn_pin) connected to the radio
-
-void setup() {
- Serial.begin(115200);
- while (!Serial) {} //some boards need this
-
- // enable the alternate functionality for our secondary SPI bus' pins
- pinPeripheral(MY_MISO, PIO_SERCOM_ALT);
- pinPeripheral(MY_MOSI, PIO_SERCOM_ALT);
- pinPeripheral(MY_SCLK, PIO_SERCOM);
-
- MY_SPI.begin(); // initialize the secondary SPI bus
-
- if (!radio.begin(&MY_SPI)) {
- Serial.println(F("radio hardware not responding!!"));
- while (1) {} // hold program in infinite loop to prevent subsequent errors
- }
-
- // ... continue with program as normal (see library examples/ folder)
-}
-``` -->
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/attiny.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/attiny.md
deleted file mode 100644
index f048438..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/attiny.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# ATTiny
-
-@tableofcontents
-
-ATTiny support for this library relies on the SpenceKonde ATTinyCore. Be sure to have added this core to the Arduino Boards Manager with [this install guide](http://highlowtech.org/?p=1695)
-
-See the included rf24ping85 example for pin info and usage
-
-@warning The ATTiny2313 is unsupported due to lack of sufficient memory resources
-
-Some versions of Arduino IDE may require a patch to allow use of the full program space on ATTiny. See [this resource](https://github.com/TCWORLD/ATTinyCore/tree/master/PCREL%20Patch%20for%20GCC) for the ATTiny patch.
-
-ATTiny board support initially added from [jscrane/RF24](https://github.com/jscrane/RF24)
-
-## Hardware Configuration
-
-By [tong67](https://github.com/tong67)
-
-### ATtiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 4
-
-```text
- +-\/-+
- NC PB5 1|o |8 Vcc --- nRF24L01 VCC, pin2 --- LED --- 5V
-nRF24L01 CE, pin3 --- PB3 2| |7 PB2 --- nRF24L01 SCK, pin5
-nRF24L01 CSN, pin4 --- PB4 3| |6 PB1 --- nRF24L01 MOSI, pin6
-nRF24L01 GND, pin1 --- GND 4| |5 PB0 --- nRF24L01 MISO, pin7
- +----+
-```
-
-### ATtiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 3 - PB3 and PB4 are free to use for application
-
-- Circuit idea from [NerdRalph's 3 pin solution](http://nerdralph.blogspot.ca/2014/01/nrf24l01-control-with-3-attiny85-pins.html)
-- Original RC combination was 1K/100nF. 22K/10nF combination worked better.
-- For best settle-time delay value in `RF24::csn()` the timingSearch3pin.ino sketch can be used.
-- This configuration is enabled when CE_PIN and CSN_PIN are equal, e.g. both 3
-- Because CE is always high the power consumption is higher than for 5 pins solution
-
-```text
- ^^
- +-\/-+ nRF24L01 CE, pin3 ------| //
- PB5 1|o |8 Vcc --- nRF24L01 VCC, pin2 ------x----------x--|<|-- 5V
- NC PB3 2| |7 PB2 --- nRF24L01 SCK, pin5 --|<|---x-[22k]--| LED
- NC PB4 3| |6 PB1 --- nRF24L01 MOSI, pin6 1n4148 |
-nRF24L01 GND, pin1 -x- GND 4| |5 PB0 --- nRF24L01 MISO, pin7 |
- | +----+ |
- |-----------------------------------------------||----x-- nRF24L01 CSN, pin4
- 10nF
-```
-
-### ATtiny24/44/84 Pin map with CE_PIN 8 and CSN_PIN 7
-
-- Schematic provided and successfully tested by [Carmine Pastore](https://github.com/Carminepz)
-
-```text
- +-\/-+
-nRF24L01 VCC, pin2 --- VCC 1|o |14 GND --- nRF24L01 GND, pin1
- PB0 2| |13 AREF
- PB1 3| |12 PA1
- PB3 4| |11 PA2 --- nRF24L01 CE, pin3
- PB2 5| |10 PA3 --- nRF24L01 CSN, pin4
- PA7 6| |9 PA4 --- nRF24L01 SCK, pin5
-nRF24L01 MISO, pin7 --- PA6 7| |8 PA5 --- nRF24L01 MOSI, pin6
- +----+
-```
-
-### ATtiny2313/4313 Pin map with CE_PIN 12 and CSN_PIN 13
-
-```text
- +-\/-+
- PA2 1|o |20 VCC --- nRF24L01 VCC, pin2
- PD0 2| |19 PB7 --- nRF24L01 SCK, pin5
- PD1 3| |18 PB6 --- nRF24L01 MOSI, pin6
- PA1 4| |17 PB5 --- nRF24L01 MISO, pin7
- PA0 5| |16 PB4 --- nRF24L01 CSN, pin4
- PD2 6| |15 PB3 --- nRF24L01 CE, pin3
- PD3 7| |14 PB2
- PD4 8| |13 PB1
- PD5 9| |12 PB0
-nRF24L01 GND, pin1 --- GND 10| |11 PD6
- +----+
-```
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/atxmega.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/atxmega.md
deleted file mode 100644
index 721c088..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/atxmega.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# ATXMEGA
-
-@tableofcontents
-
-The RF24 driver can be build as a static library with Atmel Studio 7 in order to be included as any other library in another program for the XMEGA family.
-
-Currently only the [ATXMEGA D3](https://www.microchip.com/wwwproducts/en/ATxmega64d3) family is implemented.
-
-## Preparation
-
-Create an empty GCC Static Library project in Atmel Studio 7.
-
-As not all files are required, copy the following directory structure in the project:
-
-```text
-utility\
- ATXMegaD3\
- compatibility.c
- compatibility.h
- gpio.cpp
- gpio.h
- gpio_helper.c
- gpio_helper.h
- includes.h
- RF24_arch_config.h
- spi.cpp
- spi.h
-nRF24L01.h
-printf.h
-RF24.cpp
-RF24.h
-RF24_config.h
-```
-
-## Usage
-
-Add the library to your project!
-
-In the file where the `main()` is put the following in order to update the millisecond functionality:
-
-```cpp
-ISR(TCE0_OVF_vect)
-{
- update_milisec();
-}
-```
-
-Declare the rf24 radio with `RF24 radio(XMEGA_PORTC_PIN3, XMEGA_SPI_PORT_C);`
-
-1. First parameter is the CE pin which can be any available pin on the microcontroller.
-2. Second parameter is the CS which can be on port C (**XMEGA_SPI_PORT_C**) or on port D (**XMEGA_SPI_PORT_D**).
-
-Call the `__start_timer()` to start the millisecond timer.
-
-@note The millisecond functionality is based on the TCE0 so don't use these pins as IO.
-
-@note The operating frequency of the uC is 32MHz. If you have a different frequency, change the TCE0 registers appropriately in function `__start_timer()` in **compatibility.c** file for your frequency.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/cross_compile.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/cross_compile.md
deleted file mode 100644
index b1a4396..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/cross_compile.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Linux cross-compilation
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 -->
-@warning These instructions are no longer recommended because they involve disabling security measures
-for the target system. Please try the [instructions using CMake](using_cmake.md).
-
-RF24 library supports cross-compilation. Advantages of cross-compilation:
-
-- development tools don't have to be installed on target machine
-- resources of target machine don't have to be sufficient for compilation
-- compilation time can be reduced for large projects
-
-Following prerequisites need to be assured:
-
-- ssh password-less access to target machine [Here is a hint](https://linuxconfig.org/passwordless-ssh)
-- sudo of a remote user without password [Here is a hint](http://askubuntu.com/questions/334318/sudoers-file-enable-nopasswd-for-user-all-commands)
-- cross-compilation toolchain for your target machine; for RPi
- ```shell
- git clone https://github.com/raspberrypi/tools rpi_tools
- ```
- and cross-compilation tools must be in PATH, for example
- ```shell
- export PATH=$PATH:/your/dir/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- ```
-
-## Cross compilation steps
-
-1. clone RF24 to a machine for cross-compilation
- ```shell
- git clone https://github.com/nRF24/RF24
- cd RF24
- ```
-2. configure for cross compilation
- ```shell
- ./configure --remote=pi@target_linux_host
- ```
- eventually
- ```shell
- ./configure --remote=pi@target_linux_host --driver=<driver>
- ```
-3. build
- ```shell
- make
- ```
-4. (optional) install library to cross-compilation machine into cross-environment - important for compilation of examples
- ```shell
- sudo make install
- ```
-5. upload library to target machine
- ```shell
- make upload
- ```
-6. (optional) compile examples
- ```shell
- cd examples_linux
- make
- ```
-7. (optional) upload examples to target machine
- ```shell
- make upload
- ```
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/doxygen-custom.css b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/doxygen-custom.css
deleted file mode 100644
index 4a3c469..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/doxygen-custom.css
+++ /dev/null
@@ -1,166 +0,0 @@
-table.markdownTable th {
- color: unset;
-}
-
-/* overrides from default CSS for some admonitions */
-dl.note,
-dl.remark,
-dl.warning,
-dl.attention,
-dl.important,
-dl.deprecated,
-dl.see {
- color: unset;
- box-shadow: 5px 5px 5px hsla(0, 0%, 19.2%, 0.5);
-}
-
-dl.remark {
- background: var(--remark-color-bg);
- border-left: 8px solid var(--remark-color-hl);
-}
-
-dl.remark dt {
- color: var(--remark-color-hl);
-}
-
-dl.important dt {
- color: var(--important-color-hl);
-}
-
-dl.important {
- background: var(--important-color-bg);
- border-left: 8px solid var(--important-color-hl);
-}
-
-dl.attention dt {
- color: var(--attention-color-hl);
-}
-
-dl.attention {
- background: var(--attention-color-bg);
- border-left: 8px solid var(--attention-color-hl);
-}
-
-dl.deprecated dt {
- color: var(--deprecated-color-hl);
-}
-
-dl.deprecated {
- background: var(--deprecated-color-bg);
- border-left: 8px solid var(--deprecated-color-hl);
-}
-
-/* special rules to accent `/see` or `/sa` command output */
-dl.see {
- background: var(--seealso-color-bg);
- border-left: 8px solid var(--seealso-color-hl);
-}
-
-dl.see dt {
- color: var(--seealso-color-hl);
-}
-
-dl.see {
- padding: 10px;
- margin: 10px 0px;
- overflow: hidden;
- margin-left: 0;
- border-radius: 4px;
-}
-
-dl.see dd {
- margin-left: 0;
-}
-
-/* admonition icons */
-dl.note dt::before {
- background-color: var(--note-color-hl);
- mask-image: var(--note-icon);
-}
-
-dl.see dt::before {
- background-color: var(--seealso-color-hl);
- mask-image: var(--seealso-icon);
-}
-
-dl.remark dt::before {
- background-color: var(--remark-color-hl);
- mask-image: var(--remark-icon);
-}
-
-dl.warning dt::before {
- background-color: var(--warning-color-hl);
- mask-image: var(--warning-icon);
-}
-
-dl.deprecated dt::before {
- background-color: var(--deprecated-color-hl);
- mask-image: var(--deprecated-icon);
-}
-
-dl.important dt::before {
- background-color: var(--important-color-hl);
- mask-image: var(--important-icon);
-}
-
-dl.attention dt::before {
- background-color: var(--attention-color-hl);
- mask-image: var(--attention-icon);
-}
-
-dl.note dt::before,
-dl.see dt::before,
-dl.warning dt::before,
-dl.remark dt::before,
-dl.deprecated dt::before,
-dl.important dt::before,
-dl.attention dt::before {
- vertical-align: middle;
- background-repeat: no-repeat;
- content: "";
- display: inline-block;
- height: 2em;
- width: 2em;
- margin-right: 0.25rem;
-}
-
-dl.note dt,
-dl.see dt,
-dl.warning dt,
-dl.remark dt,
-dl.deprecated dt,
-dl.important dt,
-dl.attention dt {
- margin-top: -0.35em;
- margin-bottom: 0.5em;
-}
-
-/* icon SVG data */
-*:root {
- --note-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="M480-280q17 0 28.5-11.5T520-320v-160q0-17-11.5-28.5T480-520q-17 0-28.5 11.5T440-480v160q0 17 11.5 28.5T480-280Zm0-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>');
- --warning-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="m40-120 440-760 440 760H40Zm138-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm-40-120h80v-200h-80v200Zm40-100Z"/></svg>');
- --remark-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="M480-80q-33 0-56.5-23.5T400-160h160q0 33-23.5 56.5T480-80ZM360-200q-17 0-28.5-11.5T320-240q0-17 11.5-28.5T360-280h240q17 0 28.5 11.5T640-240q0 17-11.5 28.5T600-200H360Zm-30-120q-69-41-109.5-110T180-580q0-125 87.5-212.5T480-880q125 0 212.5 87.5T780-580q0 81-40.5 150T630-320H330Zm24-80h252q45-32 69.5-79T700-580q0-92-64-156t-156-64q-92 0-156 64t-64 156q0 54 24.5 101t69.5 79Zm126 0Z"/></svg>');
- --attention-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440ZM363-120q-16 0-30.5-6T307-143L143-307q-11-11-17-25.5t-6-30.5v-234q0-16 6-30.5t17-25.5l164-164q11-11 25.5-17t30.5-6h234q16 0 30.5 6t25.5 17l164 164q11 11 17 25.5t6 30.5v234q0 16-6 30.5T817-307L653-143q-11 11-25.5 17t-30.5 6H363Zm1-80h232l164-164v-232L596-760H364L200-596v232l164 164Zm116-280Z"/></svg>');
- --important-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="M480-360q17 0 28.5-11.5T520-400q0-17-11.5-28.5T480-440q-17 0-28.5 11.5T440-400q0 17 11.5 28.5T480-360Zm0-160q17 0 28.5-11.5T520-560v-160q0-17-11.5-28.5T480-760q-17 0-28.5 11.5T440-720v160q0 17 11.5 28.5T480-520ZM240-240l-92 92q-19 19-43.5 8.5T80-177v-623q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240Zm-34-80h594v-480H160v525l46-45Zm-46 0v-480 480Z"/></svg>');
- --seealso-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="M480-320q75 0 127.5-52.5T660-500q0-75-52.5-127.5T480-680q-75 0-127.5 52.5T300-500q0 75 52.5 127.5T480-320Zm0-72q-45 0-76.5-31.5T372-500q0-45 31.5-76.5T480-608q45 0 76.5 31.5T588-500q0 45-31.5 76.5T480-392Zm0 192q-146 0-266-81.5T40-500q54-137 174-218.5T480-800q146 0 266 81.5T920-500q-54 137-174 218.5T480-200Zm0-300Zm0 220q113 0 207.5-59.5T832-500q-50-101-144.5-160.5T480-720q-113 0-207.5 59.5T128-500q50 101 144.5 160.5T480-280Z"/></svg>');
- --deprecated-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg>');
-}
-
-/* color overrides */
-html,
-html.dark-mode {
- --note-color-hl: hsl(213.7, 92.8%, 62%);
- --note-color-bg: hsla(213.7, 92.8%, 62%, 12.5%);
- --warning-color-hl: hsl(40.6, 72.1%, 47.8%);
- --warning-color-bg: hsla(40.6, 72.1%, 47.8%, 12.5%);
- --attention-color-hl: hsl(2.7, 92.6%, 62.9%);
- --attention-color-bg: hsla(2.7, 92.6%, 62.9%, 12.5%);
- --deprecated-color-hl: hsl(0, 0%, 47%);
- --deprecated-color-bg: hsla(0, 0%, 47%, 12.5%);
- --seealso-color-hl: hsl(323, 72%, 52%);
- --seealso-color-bg: hsla(323, 72%, 52%, 12.5%);
- --remark-color-hl: hsl(128.4, 49.2%, 48.6%);
- --remark-color-bg: hsla(128.4, 49.2%, 48.6%, 12.5%);
- --important-color-hl: hsl(262.4, 89.8%, 73.1%);
- --important-color-bg: hsla(262.4, 89.8%, 73.1%, 12.5%);
-} \ No newline at end of file
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/Logo large.png b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/Logo large.png
deleted file mode 100644
index 25e4215..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/Logo large.png
+++ /dev/null
Binary files differ
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/favicon.ico b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/favicon.ico
deleted file mode 100644
index c15a165..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/images/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/linux_install.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/linux_install.md
deleted file mode 100644
index 73ca893..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/linux_install.md
+++ /dev/null
@@ -1,152 +0,0 @@
-# Linux Installation
-
-@tableofcontents
-
-Generic Linux devices are supported via SPIDEV, PiGPIO, MRAA, RPi native via BCM2835, or using LittleWire.
-
-@note The SPIDEV option should work with most Linux systems supporting spi userspace device.
-
-
-### Automatic Installation (New)
-
-Using CMake: (See the [instructions using CMake](using_cmake.md) for more information and options)
-
-1. Download the install.sh file from [https://github.com/nRF24/.github/blob/main/installer/install.sh](https://github.com/nRF24/.github/blob/main/installer/install.sh)
- ```shell
- wget https://raw.githubusercontent.com/nRF24/.github/main/installer/install.sh
- ```
-2. Make it executable
- ```shell
- chmod +x install.sh
- ```
-3. Run it and choose your options
- ```shell
- ./install.sh
- ```
-
- @warning
- `SPIDEV` is now always selected as the default driver because
- all other Linux drivers are being removed in the future.
- See [RF24 issue #971](https://github.com/nRF24/RF24/issues/971) for rationale.
-
- It will also ask to install a python package named [pyRF24](https://github.com/nRF24/pyRF24).
- This is not the same as the traditionally provided python wrappers because the pyRF24 package can be
- used independent of the C++ installed libraries. For more information on this newer python
- package, please check out [the pyRF24 documentation](https://nrf24.github.io/pyRF24/).
-4. Try an example from one of the libraries
- ```shell
- cd ~/rf24libs/RF24/examples_linux
- ```
-
- Edit the gettingstarted example, to set your pin configuration
- ```shell
- nano gettingstarted.cpp
- ```
-
- Build the examples. Remember to set the `RF24_DRIVER` option according to the one that was
- selected during the scripted install.
- ```shell
- mkdir build && cd build
- cmake .. -D RF24_DRIVER=SPIDEV
- make
- ```
-
- Run the example
- ```shell
- sudo ./gettingstarted
- ```
-
-See the [instructions using CMake](using_cmake.md) for more information and options
-
-## Automated Install (Deprecated - 32 bit only)
-
-**Designed & Tested on RPi** - Defaults to SPIDEV on devices supporting it
-
-1. Install prerequisites if there are any (pigpio, MRAA, LittleWire libraries, setup SPI device etc)
-2. Download the install.sh file from [http://tmrh20.github.io/RF24Installer/RPi/install.sh](http://tmrh20.github.io/RF24Installer/RPi/install.sh)
- ```shell
- wget http://tmrh20.github.io/RF24Installer/RPi/install.sh
- ```
-3. Make it executable
- ```shell
- chmod +x install.sh
- ```
-4. Run it and choose your options
- ```shell
- ./install.sh
- ```
-
- @warning
- `SPIDEV` is now always selected as the default driver because
- all other Linux drivers are being removed in the future.
- See [RF24 issue #971](https://github.com/nRF24/RF24/issues/971) for rationale.
-
-5. Run an example from one of the libraries
- ```shell
- cd rf24libs/RF24/examples_linux
- ```
- Edit the gettingstarted example, to set your pin configuration
- ```shell
- nano gettingstarted.cpp
- make
- sudo ./gettingstarted
- ```
-
-## Manual Install (Deprecated - 32 bit only)
-
-1. Install prerequisites if there are any (pigpio, MRAA, LittleWire libraries, setup SPI device etc)
- @note See the [MRAA](http://iotdk.intel.com/docs/master/mraa/index.html) documentation for more info on installing MRAA
-2. Make a directory to contain the RF24 and possibly RF24Network lib and enter it
- ```shell
- mkdir ~/rf24libs
- cd ~/rf24libs
- ```
-3. Clone the RF24 repo
- ```shell
- git clone https://github.com/tmrh20/RF24.git RF24
- ```
-4. Change to the new RF24 directory
- ```shell
- cd RF24
- ```
-5. Configure build environment using the command:
- ```shell
- ./configure
- ```
- It automatically detects device and build environment.
-
- @warning
- `SPIDEV` is now always selected as the default driver because
- all other Linux drivers are being removed in the future.
- See [RF24 issue #971](https://github.com/nRF24/RF24/issues/971) for rationale.
-
- For overriding automatic detections, use command-line arguments, see
- ```shell
- ./configure --help
- ```
- for description.
-6. Build the library, and run an example file
- ```shell
- make
- sudo make install
- ```
- ```shell
- cd examples_linux
- ```
- Edit the gettingstarted example, to set your pin configuration
- ```shell
- ano gettingstarted.cpp
- make
- sudo ./gettingstarted
- ```
-
-### Build using SPIDEV (Deprecated - 32 bit only)
-
-1. Make sure that spi device support is enabled and /dev/spidev\<a\>.\<b\> is present
-2. Manual Install using SPIDEV:
- ```shell
- ./configure --driver=SPIDEV
- make
- sudo make install
- ```
-3. See the gettingstarted example for an example of pin configuration
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/main_page.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/main_page.md
deleted file mode 100644
index 6539549..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/main_page.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Optimized High Speed Driver for nRF24L01(+) 2.4GHz Wireless Transceiver
-
-@tableofcontents
-
-## Design Goals
-
-This library fork is designed to be...
-
-- More compliant with the manufacturer specified operation of the chip, while allowing advanced users
- to work outside the recommended operation.
-- Utilize the capabilities of the radio to their full potential via Arduino
-- More reliable, responsive, bug-free and feature rich
-- Easy for beginners to use, with well documented examples and features
-- Consumed with a public interface that's similar to other Arduino standard libraries
-
-## News
-
-See the releases' descriptions on
-[the library's release page](http://github.com/nRF24/RF24/releases) for a list of
-changes.
-
-> [!IMPORTANT]
-> There's going to be major changes in v2.0.
-> As of v1.5, there is [newer API](migration.md) that should be used instead of
-> the @ref deprecated "deprecated API".
->
-> See our [migration guide](migration.md) to understand what you should update in your code.
-
-## Useful References
-
-- [RF24 Class Documentation](classRF24.html)
-- [Support & Configuration](pages.html)
-- [Source Code](https://github.com/nRF24/RF24/)
-- [Datasheets](https://github.com/nRF24/RF24/tree/master/datasheets)
-
-### Additional Information and Add-ons
-
-- [RF24Network](http://nRF24.github.io/RF24Network): OSI Network Layer for multi-device communication. Create a home sensor network.
-- [RF24Mesh](http://nRF24.github.io/RF24Mesh): Dynamic Mesh Layer for RF24Network
-- [RF24Ethernet](http://nRF24.github.io/RF24Ethernet): TCP/IP Radio Mesh Networking (shares Arduino Ethernet API)
-- [RF24Audio](http://nRF24.github.io/RF24Audio): Realtime Wireless Audio streaming
-- [nrf_to_nrf](https://github.com/TMRh20/nrf_to_nrf): OSI Layer 2 radio driver for NRF52x radios. Replaces RF24 layer for new radio devices.
-- [RF24G](https://hobietime.github.io/RF24G/html/): Create a true mesh of up to 7 nrf24l01 and/or nrf52x devices
-- [TMRh20 Blog: RF24 Optimization Overview](http://tmrh20.blogspot.com/2014/03/high-speed-data-transfers-and-wireless.html)
-- [TMRh20: RPi/Linux with RF24Gateway](http://tmrh20.blogspot.com/2016/08/raspberry-pilinux-with-nrf24l01.html)
-- [All TMRh20 Documentation Main Page](http://tmrh20.github.io/)
-
-### More Information
-
-- [Project Blog: TMRh20.blogspot.com](http://TMRh20.blogspot.com)
-- [Maniacal Bits Blog](http://maniacalbits.blogspot.ca/)
-- [Original Maniacbug RF24Network Blog Post](https://maniacbug.wordpress.com/2012/03/30/rf24network/)
-- [ManiacBug on GitHub](https://github.com/maniacbug/RF24) (Original Library Author)
-- [MySensors.org](http://www.mysensors.org/) (User friendly sensor networks/IoT)
-
-## Platform Support Pages
-
-- [Arduino](arduino.md) (Uno, Nano, Mega, Due, Galileo, etc)
-- [ATTiny](attiny.md)
-- [Pico SDK support](pico_sdk.md)
-- [Linux Installation](linux_install.md) (or the alternative [instructions using CMake](using_cmake.md)),
- ([Linux/RPi General](rpi_general.md), [MRAA](mraa.md) supported boards (Galileo, Edison, etc), LittleWire)
-- [Cross-compilation](cross_compile.md) for linux devices
-- [Python wrapper](python_wrapper.md) available for Linux devices
-
-### General µC Pin layout
-
-@see also the individual board [support pages](pages.html) for more info
-
-Observe
-
-![pinout.jpg](images/pinout.jpg)
-
-The table below shows how to connect the the pins of the NRF24L01(+) to different boards.
-CE and CSN are configurable.
-
-| PIN | NRF24L01 | Arduino UNO | ATtiny25/45/85 [0] | ATtiny44/84 [1] | LittleWire [2] | RPI | RPi -P1 Connector |
-| --- | -------- | ----------- | ------------------ | --------------- | ----------------------- | ---------- | ----------------- |
-| 1 | GND | GND | pin 4 | pin 14 | GND | rpi-gnd | (25) |
-| 2 | VCC | 3.3V | pin 8 | pin 1 | regulator 3.3V required | rpi-3v3 | (17) |
-| 3 | CE | digIO 7 | pin 2 | pin 12 | pin to 3.3V | rpi-gpio22 | (15) |
-| 4 | CSN | digIO 8 | pin 3 | pin 11 | RESET | rpi-gpio8 | (24) |
-| 5 | SCK | digIO 13 | pin 7 | pin 9 | SCK | rpi-sclk | (23) |
-| 6 | MOSI | digIO 11 | pin 6 | pin 7 | MOSI | rpi-mosi | (19) |
-| 7 | MISO | digIO 12 | pin 5 | pin 8 | MISO | rpi-miso | (21) |
-| 8 | IRQ | - | - | - | - | - | - |
-
-- [0] https://learn.sparkfun.com/tutorials/tiny-avr-programmer-hookup-guide/attiny85-use-hints
-- [1] http://highlowtech.org/?p=1695 The ATTiny2313 is unsupported due to lack of sufficient memory resources.
-- [2] http://littlewire.github.io/
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/migration.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/migration.md
deleted file mode 100644
index b4d3782..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/migration.md
+++ /dev/null
@@ -1,287 +0,0 @@
-# Migration guide
-
-@tableofcontents
-
-<!-- markdownlint-disable MD033 MD031 -->
-
-This is a collection of snippets that highlight preferred API over the deprecated original API.
-
-## isAckPayloadAvailable()
-
-> **Deprecated since v1.4.2**
-
-This function is equivalent to `RF24::available()`.
-Any use of `RF24::isAckPayloadAvailable()` is interchangeable with `RF24::available()`.
-
-<table><tr>
-<th>Old</th>
-<th>New (supported)</th>
-</tr><tr><td>
-
-```cpp
-if radio.isAckPayloadAvailable() { /* .. */ }
-```
-
-</td><td>
-
-```cpp
-if radio.available() { /* .. */ }
-```
-
-</td></tr></table>
-
-## 64-bit integer addresses
-
-Any function that accept an address in the form of `uint64_t` is discouraged. This includes
-
-- `RF24::openReadingPipe(uint8_t, uint64_t)`
- > **Deprecated since v1.3.11**
-- `RF24::openWritingPipe(uint64_t)`
- > **Deprecated since v1.3.11**
-- `RF24::stopListening(const uint64_t)`
- > **Deprecated since v1.5**
-
-These functions' address parameter use a 64-bit unsigned integer (`uint64_t`).
-The nRF24L01 can only use up to 40 bit addresses.
-Thus, there is an unused 24 bits being allocated for addresses using these functions.
-
-There are overloaded functions that use a buffer instead:
-
-- `RF24::openReadingPipe(uint8_t, const uint8_t*)`
-- `RF24::openWritingPipe(const uint8_t*)`
-- `RF24::stopListening(const uint8_t*)`
-
-These eliminate the unnecessary 24 bits by only using the length of the buffer (`uint8_t*`)
-specified by `RF24::setAddressWidth()`.
-
-@see The `RF24::openWritingPipe(const uint8_t*)` is now deprecated in favor of the
-overloaded `RF24::stopListening(const uint8_t*)` function.
-See the section below for more detail.
-
-> [!CAUTION]
-> The endianness (byte order) of a buffer is reversed compared to a 64-bit integer.
-> ```c
-> uint64_t address = 0xB3B4B5B6C2;
-> // is the same address as
-> uint8_t address[5] = {0xC2, 0xB6, 0xB5, 0xB4, 0xB3};
-> ```
-> Notice the MSB (Most Significant Byte) `0xC2` is last in the integer but first in the buffer.
-
-<table><tr>
-<th>Old</th>
-<th>New (supported)</th>
-</tr><tr><td>
-
-```cpp
-uint64_t address = 0xB3B4B5B6C2;
-radio.openReadingPipe(1, address);
-```
-
-</td><td>
-
-```cpp
-uint8_t address[5] = {0xC2, 0xB6, 0xB5, 0xB4, 0xB3};
-radio.openReadingPipe(1, address);
-```
-
-</td></tr></table>
-
-> [!NOTE]
-> Our examples actually use a C-string casted as an array of 6 bytes.
-> That's because a C-string (`char*`) must be NULL terminated (`\0` at the end) in memory.
-> ```c
-> uint8_t address[][6] = { "1Node", "2Node" };
-> // is equivalent to
-> uint8_t address[][6] = { { '1', 'N', 'o', 'd', 'e', '\0' },
-> { '2', 'N', 'o', 'd', 'e', '\0' } };
-> ```
-
-## isFifo(bool, bool)
-
-> **Deprecated since v1.4.11**
-
-Introduced as a compliment to `RF24::isFifo(bool)` in v1.4.3, this function was
-supposed to provide a specific detail about a specified radio's FIFO. However, it was
-discovered that the function may not highlight binary corruption (`RF24_FIFO_INVALID`)
-observed in the SPI bus' MISO line.
-
-A fix was introduced using enumerated values of `rf24_fifo_state_e`.
-Since then, `RF24::isFifo(bool)` is now preferred as it accurately describes the result.
-
-<table><tr>
-<th>Old</th>
-<th>New (supported)</th>
-</tr><tr><td>
-
-```cpp
-bool rxFifoEmpty = radio.isFifo(false, true);
-```
-
-</td><td>
-
-```cpp
-bool rxFifoEmpty = radio.isFifo(false) == RF24_FIFO_EMPTY;
-```
-
-</td></tr></table>
-
-## maskIRQ()
-
-> **Deprecated since v1.5**
-
-Originally `RF24::maskIRQ()` was the only function provided to influence the radio's IRQ pin.
-However, the 3 required boolean parameters made this prone to bugs in user code.
-The parameters' meaning was confusingly reversed, and they were easily misplaced in the wrong order.
-
-A better approach was introduced with `RF24::setStatusFlags()`.
-It's 1 parameter accepts values defined by the `rf24_irq_flags_e` enumerated constants.
-These constant values specify individual events;
-they can also be OR'd together to specify multiple events.
-
-<table><tr>
-<th>Old</th>
-<th>New (supported)</th>
-</tr><tr><td>
-
-```cpp
-// IRQ pin only activated by "RX Data Ready" event
-radio.maskIRQ(1, 1, 0);
-
-// IRQ pin activated by "TX Data Sent" and TX Data Failed" events
-radio.maskIRQ(0, 0, 1);
-
-// IRQ pin activated by all events
-radio.maskIRQ(0, 0, 0);
-
-// IRQ pin disabled
-radio.maskIRQ(1, 1, 1);
-```
-
-</td><td>
-
-```cpp
-// IRQ pin only activated by "RX Data Ready" event
-radio.setStatusFlags(RF24_RX_DR);
-
-// IRQ pin activated by "TX Data Sent" and TX Data Failed" events
-radio.setStatusFlags(RF24_TX_DS | RF24_TX_DF);
-
-// IRQ pin activated by all events
-radio.setStatusFlags(RF24_IRQ_ALL);
-
-// IRQ pin disabled
-radio.setStatusFlags(RF24_IRQ_NONE);
-// or equivalently
-radio.setStatusFlags();
-```
-
-</td></tr></table>
-
-## whatHappened()
-
-> **Deprecated since v1.5**
-
-Originally, `RF24::whatHappened()` was the only way to clear the events that triggered the IRQ pin.
-Like `maskIRQ()`, this was also prone to bugs because of the 3 required boolean parameters
-(passed by reference).
-
-The aptly named `RF24::clearStatusFlags()` is designed to be a replacement for `RF24::whatHappened()`.
-Like `RF24::clearStatusFlags()`, `RF24::setStatusFlags()` takes 1 parameter whose value is defined by
-the `rf24_irq_flags_e` enumerated constants. These constant values specify individual flags;
-they can also be OR'd together to specify multiple flags.
-
-Additionally, `RF24::clearStatusFlags()` returns the STATUS byte containing the flags that
-caused the IRQ pin to go active LOW.
-This allows the user code to allocate less memory when diagnosing the IRQ pin's meaning.
-
-<table><tr>
-<th>Old</th>
-<th>New (supported)</th>
-</tr><tr><td>
-
-```cpp
-bool tx_ds, tx_df, rx_dr;
-radio.whatHappened(tx_ds, tx_df, rx_dr);
-```
-
-</td><td>
-
-```cpp
-uint8_t flags = radio.clearStatusFlags();
-// or equivalently
-uint8_t flags = radio.clearStatusFlags(RF24_IRQ_ALL);
-
-// focus on the events you care about
-if (flags & RF24_TX_DS) { /* TX data sent */ }
-if (flags & RF24_TX_DF) { /* TX data failed to send */ }
-if (flags & RF24_RX_DR) { /* RX data is in the RX FIFO */ }
-
-// only clear the "TX Data Sent" and TX Data Failed" events
-radio.clearStatusFlags(RF24_TX_DS | RF24_TX_DF);
-
-// only clear the "RX Data Ready" event
-radio.clearStatusFlags(RF24_RX_DR);
-```
-
-</td></tr></table>
-
-## openWritingPipe(const uint8_t*)
-
-> Deprecated since v1.5
-
-Originally, `RF24::openWritingPipe(const uint8_t*)` was just a compliment to
-`RF24::openReadingPipe()`.
-It changes the address on pipe 0 because that is the only pipe that can be
-used for transmitting.
-
-Unfortunately, there was a bug that prevented the given TX address from being
-persistent on pipe 0 if the user code also set an RX address to pipe 0.
-This bug would surface when switching between RX mode and TX mode (via
-`RF24::startListening()` and `RF24::stopListening()` respectively) or after
-`RF24::stopConstCarrier()` (if `RF24::isPVariant()` returns `true`).
-
-The solution is to cache the TX address on the `RF24` instance.
-Consequently, this solution did not fit well with the traditional order of
-functions used to set up the radio's TX or RX mode.
-
-By overloading `RF24::stopListening(const uint8_t*)`, we are able to ensure proper radio
-setup without requiring certain functions are called in a certain order.
-
-- Use `RF24::stopListening(const uint8_t*)` to set the TX address and enter inactive TX mode.
- `RF24::openReadingPipe()` can now (as of v1.5) be used in TX mode without consequence.
-- Use `RF24::stopListening()` to enter inactive TX mode without changing the TX address.
-
-> [!warning]
-> Avoid using pipe 0 for RX operations to improve performance and reliability.
->
-> For implementation detail, see the source for `RF24::openReadingPipe()` and
-> `RF24::stopListening()`. Ultimately, the datasheet's Appendix A has a detailed
-> example outlining the order of a proper radio setup.
-
-<table><tr>
-<th>Old</th>
-<th>New (supported)</th>
-</tr><tr><td>
-
-```cpp
-// set TX address (pipe 0)
-radio.openWritingPipe(tx_address);
-
-// set RX address (pipe 1)
-radio.openReadingPipe(1, rx_address);
-
-// idle radio using inactive TX mode
-radio.stopListening();
-```
-
-</td><td>
-
-```cpp
-// set TX address (pipe 0)
-radio.stopListening(tx_address); // enters inactive TX mode
-
-// set RX address (pipe 1)
-radio.openReadingPipe(1, rx_address);
-```
-
-</td></tr></table>
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/mraa.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/mraa.md
deleted file mode 100644
index 175b7b4..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/mraa.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# MRAA
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 -->
-MRAA is a Low Level Skeleton Library for Communication on GNU/Linux platforms.
-Review the [MRAA documentation](http://iotdk.intel.com/docs/master/mraa/index.html) for more information
-
-RF24 supports all MRAA supported platforms, but it might not have been tested on each individual platform due to the wide range of hardware support:
-
-- [Report an RF24 bug or issue](https://github.com/TMRh20/RF24/issues)
-
-## Setup and installation
-
-Build using the **MRAA** library from [MRAA documentation](http://iotdk.intel.com/docs/master/mraa/index.html)
-
-MRAA is not included.
-
-1. Install, and build MRAA
- ```shell
- git clone https://github.com/intel-iot-devkit/mraa.git
- cd mraa
- mkdir build
- cd build
- cmake .. -DBUILDSWIGNODE=OFF
- sudo make install
- ```
-2. Complete the install
- ```shell
- nano /etc/ld.so.conf
- ```
- Add the line
- ```shell
- /usr/local/lib/arm-linux-gnueabihf
- ```
- Run
- ```shell
- sudo ldconfig
- ```
-3. Install RF24, using MRAA
-
- See [Linux Install instructions](linux_install.md)
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/pico_sdk.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/pico_sdk.md
deleted file mode 100644
index 6b17927..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/pico_sdk.md
+++ /dev/null
@@ -1,234 +0,0 @@
-# Raspberry Pi Pico SDK (for the RP2040)
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 MD046 -->
-Just to be very clear and concise: The following instructions are
-**not required to use the Arduino IDE** with any RP2040-based boards.
-These instructions pertain to using only [Raspberry Pi's Pico SDK](https://github.com/raspberrypi/pico-sdk)
-for RP2040 based boards.
-
-## Prerequisite
-
-Follow Raspberry Pi's
-["Getting Started with Pico" document](https://rptl.io/pico-get-started) to
-setup a proper development environment on your host PC (the machine that
-will build your project). Notice that the setup instructions are a little
-different for building on a Windows PC.
-
-Either set an environment variable named `PICO_SDK_PATH` that points to your
-local clone of the pico-sdk or put the pico-sdk next to the RF24 folder or
-next to the folder containing your project using the RF24 library:
-
- path/to/github/repos/
- pico-sdk/
- RF24/
- my_rf24_project/
-
-Alternatively, the RF24 repository (and optionally the RF24Network and RF24Mesh
-repositories) can be included into your project's "lib" folder as copies or
-git submodules. For more detail, see the below instructions to incorporate
-RF24 libs into your project.
-
-## Building the RF24 examples for the Pico SDK
-
-Each example imports a set of constants (`CE_PIN`, `CSN_PIN`, `IRQ_PIN`) from the
-examples_pico/defaultPins.h file. Default values for SPI pins (SCK, MOSI, MISO)
-come from the Pico SDK repository's
-[pico-sdk/src/boards/include/boards/\<board_name>.h files](https://github.com/raspberrypi/pico-sdk/tree/master/src/boards/include/boards)
-
-1. Create a "build" directory in the RF24 repository's root directory and
- navigate to it:
- ```sh
- cd RF24
- mkdir build
- cd build
- ```
-2. Configure CMake for your desired build type and specific RP2040-based board
- ```sh
- cmake ../examples_pico -DCMAKE_BUILD_TYPE=Release -DPICO_BOARD=pico
- ```
- Or if building on a Windows PC:
- ```sh
- cmake -G "NMake Makefiles" ../examples_pico -DCMAKE_BUILD_TYPE=Release -DPICO_BOARD=pico
- ```
- The supported RP2040-based boards are listed in header files in the Pico SDK
- repository's [pico-sdk/src/boards/include/boards/\<board_name>.h files](https://github.com/raspberrypi/pico-sdk/tree/master/src/boards/include/boards).
- If the `-DPICO_BOARD` option is not specified, then the Pico SDK will default to building for the Raspberry Pi Pico board.
-3. Build the examples using the CMakeLists.txt file located in the
- RF24/examples_pico directory.
- ```sh
- cmake --build . --config Release
- ```
- Notice we specified the build type again using the `--config` option.
-
- @note If you see an error stating "'PICO_DEFAULT_SPI_SCK_PIN' was not declared in this scope",
- then it means the board you selected with the `-DPICO_BOARD` option (in step 2) does not have a
- default set of SPI pins defined for it. To workaround this error, see the below instructions to
- use different pins for the SPI bus.
-
- @warning If doing consecutive build attempts, it is strongly encouraged to delete all files in the build
- directory before re-attempting to build the project.
-
-## Incorporating RF24 libs into your project
-
-In order to use the RF24 libraries in your RP2040 based project:
-
-1. Make a copy of the RF24 library (and optionally RF24Network and RF24Mesh
- libraries) in a "lib" directory located in your project's root directory.
-
- path/to/my/project/
- lib/
- RF24/
- RF24Network/
- RF24Mesh/
- src/
- CMakeLists.txt
- ...
-
- Alternatively you can add the RF24\* repositories as [git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
-2. Include their CMakeLists.txt files from the RF24 libraries in your project's top-level
- CMakeLists.txt file (usually located in the "src" directory). The following snippet
- assumes that your project's "src" directory is on the same level as the previously
- mentioned "lib" directory.
- ```cmake
- include(../lib/RF24/CMakeLists.txt)
- include(../lib/RF24Network/CMakeLists.txt)
- include(../lib/RF24Mesh/CMakeLists.txt)
- ```
-3. In the same CMakeLists.txt file from step 2, add the RF24 libraries into the
- `target_link_libraries` configuration:
- ```cmake
- target_link_libraries(${CMAKE_PROJECT_NAME}
- # ... Your project's other libraries ...
- RF24
- RF24Network
- RF24Mesh
- )
- ```
- If you are using tinyUSB, this line (or similar) should already exist:
- ```cmake
- target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
- ```
-4. Finally, remember to include the necessary RF24\* libraries' header files in your
- project's source code where applicable.
- ```cpp
- #include <RF24.h>
- #include <RF24Network.h>
- #include <RF24Mesh.h>
- ```
- @note Any of the project's source file(s) that includes any of RF24\* libraries must be a C++ file.
- It is highly recommended to use the `.cpp` file extension for such project source files.
-
-## Using different pins for the SPI bus
-
-Initially (without modification), the SPI bus uses the default pins defined in the
-Pico SDK repository's [pico-sdk/src/boards/include/boards/\<board_name>.h files](https://github.com/raspberrypi/pico-sdk/tree/master/src/boards/include/boards).
-However, there may be some boards that do not define the necessary pins to use as defaults. This can
-be remedied using either project source code or build-time configuration.
-
-@warning There is no support for software driven SPI on RP2040 based boards at this time.
-If someone is so inclined to implement this using the Pico SDK's PIO (Programmable Input
-Output) feature, please submit an issue or pull request to the
-[RF24 repository](http://github.com/nRF24/RF24).
-
-@note Before deciding what pins to use for the SPI bus, review the
-[GPIO pins' "Function Select Table" in the Pico SDK documentation](https://raspberrypi.github.io/pico-sdk-doxygen/group__hardware__gpio.html#details).
-There are essentially 2 SPI buses with multiple pin options for each.
-
-### Project Source code option
-
-This option is the most reliable and flexible. It involves calling `SPI.begin()` and then passing the `SPI` object to `RF24::begin(_SPI*)`.
-
-```cpp
-#include <RF24.h>
-
-RF24 radio(7, 8); // pin numbers connected to the radio's CE and CSN pins (respectively)
-SPI spi;
-
-int main()
-{
- // again please review the GPIO pins' "Function Select Table" in the Pico SDK docs
- spi.begin(spi0, 2, 3, 4); // spi0 or spi1 bus, SCK, TX, RX
-
- if (!radio.begin(&spi)) {
- printf("Radio hardware is not responding!\n");
- }
- // continue with program as normal ...
-}
-```
-
-### Build-time configuration option
-
-To specify the default SPI pins used at build time, you can use either:
-
-1. declare these pins in the CMakeLists.txt file
- ```cmake
- target_compile_definitions(${CMAKE_PROJECT_NAME}
- PUBLIC PICO_DEFAULT_SPI=0 # can only be 0 or 1 (as in `spi0` or `spi1`)
- PUBLIC PICO_DEFAULT_SPI_SCK_PIN=2 # depends on which SPI bus (0 or 1) is being used
- PUBLIC PICO_DEFAULT_SPI_TX_PIN=3 # depends on which SPI bus (0 or 1) is being used
- PUBLIC PICO_DEFAULT_SPI_RX_PIN=4 # depends on which SPI bus (0 or 1) is being used
- )
- ```
-2. additional command line arguments
- ```shell
- cmake --build . --config Release -DPICO_DEFAULT_SPI=0 -DPICO_DEFAULT_SPI_SCK_PIN=2 -DPICO_DEFAULT_SPI_TX_PIN=3 -DPICO_DEFAULT_SPI_RX_PIN=4
- ```
-
-## Using Multiple Radios
-
-It is possible to drive multiple nRF24L01 transceivers on a single board. To do this each radio needs dedicated digital output pins for the CE and CSN pins.
-
-@warning The RPi Pico board's 3v regulator is typically insufficient to power more than 1 radio.
-It is also worth mentioning that the RPi Pico board uses a switching regulator which inherently
-produces electrical noise (a not steady 3v signal otherwise referred to as "power instability").
-
-If you want to drive each radio with a separate SPI bus, then the following example will demonstrate how to do that.
-
-```cpp
-#include <RF24.h>
-
-// Declare the pin numbers connected to the radios' CE and CSN pins (respectively)
-RF24 radio0(8, 5); // first radio object
-RF24 radio1(14, 13); // second radio object
-
-// By default, one SPI bus instance is created by the RF24 lib. We'll use this
-// default instance of the `spi0` interface for our first radio, but we want a
-// different SPI bus for the second radio.
-//
-// So, here we declare a second SPI bus instance:
-SPI my_spi; // we specify the `spi1` bus interface below
-
-bool setupRadios()
-{
- // Initialize the first radio using the default SPI instance
- if (!radio0.begin()) {
- printf("Radio0 hardware is not responding!\n");
- return false;
- }
- // first radio object initialized successfully
-
- // specify the the second SPI bus interface and corresponding GPIO pins
- my_spi.begin(spi1, 10, 11, 12); // spi1 bus, SCK, TX, RX
- if (!radio1.begin(&my_spi)) {
- printf("Radio1 hardware is not responding!\n");
- return false;
- }
- // second radio object initialized successfully
-
- return true;
-}
-
-int main()
-{
- stdio_init_all(); // init necessary IO for the RP2040
-
- while (!setupRadios()) { // if either radioX.begin() failed
- sleep_ms(1000); // add 1 second delay for console readability
- // hold program in infinite attempts to initialize the radios
- }
-
- // continue with program as normal ...
-}
-```
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/portability.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/portability.md
deleted file mode 100644
index 2fe25eb..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/portability.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# RF24 Portability
-
-@tableofcontents
-
-The RF24 radio driver mainly utilizes the [Arduino API](http://arduino.cc/en/reference/homePage)
-for GPIO, SPI, and timing functions, which are easily replicated on various platforms.
-
-Support files for these platforms are stored under RF24/utility, and can be modified to provide the
-required functionality.
-
-## Basic Hardware Template
-
-### RF24/utility
-
-The RF24 library now includes a basic hardware template to assist in porting to various platforms.
-
-The following files can be included to replicate standard Arduino functions as needed, allowing devices from ATTiny to Raspberry Pi to utilize the same core RF24 driver.
-
-| File | Purpose |
-| ------------------ | ---------------------------------------------------------------------------- |
-| RF24_arch_config.h | Basic Arduino/AVR compatibility, includes for remaining support files, etc |
-| includes.h | Linux only. Defines specific platform, include correct RF24_arch_config file |
-| spi.h | Provides standardized SPI (`transfer()`) methods |
-| gpio.h | Provides standardized GPIO (`digitalWrite()`) methods |
-| compatibility.h | Provides standardized timing (`millis()`, `delay()`) methods |
-| your_custom_file.h | Provides access to custom drivers for spi, gpio, etc |
-
-Examples are provided via the included hardware support templates in **RF24/utility**
-
-See the [modules](modules.html) page for examples of class declarations.
-
-## Device Detection
-
-1. The main detection for Linux devices is done in the configure script, with the includes.h from the proper hardware directory copied to RF24/utility/includes.h
-2. Secondary detection is completed in RF24_config.h, causing the include.h file to be included for all supported Linux devices
-3. RF24.h contains the declaration for SPI and GPIO objects 'spi' and 'gpio' to be used for porting-in related functions.
-
-## Code
-
-To have your ported code included in this library, or for assistance in porting, create a pull request or open an issue at [RF24 Library issues](https://github.com/nRF24/RF24)
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/python_wrapper.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/python_wrapper.md
deleted file mode 100644
index 58e3935..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/python_wrapper.md
+++ /dev/null
@@ -1,138 +0,0 @@
-# Python Wrapper
-
-@tableofcontents
-
-@remark
-@parblock
-We recommend using the newer [pyRF24 package](https://github.com/nRF24/pyRF24)
-[available from pypi](https://pypi.org/project/pyrf24/) because
-
-1. it is [practically drop-in compatible](https://nrf24.github.io/pyRF24/#migrating-to-pyrf24)
-2. easier to install or get updates with popular package managers like pip
-3. does not require the C++ libraries to be installed -- it uses its own isolated binaries
-4. includes wrappers for RF24, RF24Network, RF24Mesh libraries
-5. includes a new [fake BLE implementation](https://nrf24.github.io/pyRF24/ble_api.html)
-6. has its own [dedicated documentation](https://nRF24.github.io/pyRF24)
-7. is compatible with python's builtin `help()`
-8. includes typing stub files for type checking tools like mypy
-
-The only reason that you should need to keep using these older individual python
-wrappers is if you must use python v3.6 or older.
-
-You **cannot** use these individual wrappers in combination with the pyRF24 package.
-@endparblock
-
-## Python Wrapper Prerequisites
-
-These instructions work for the RF24, RF24Network, and RF24Mesh libraries, but
-the C++ source code needs to be built and installed for the corresponding
-python wrapper(s) to work.
-
-@see Review [installing with CMake](using_cmake.md) and [Linux/RPi General](rpi_general.md).
-
-@note The interrupt_configure.py example uses the
-[gpiod library](https://pypi.org/project/gpiod) to watch the radio's IRQ pin.
-
-> [!warning]
-> Recent updates to pip mandate that users manage a python virtual environment.
-> This is good practice because it avoids the risk that installing a package with pip will
-> mess up a system-installed package.
->
-> For information about using up a python virtual environment, see the official
-> [instructions using the python standard library `venv`](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/)
-> (which is a minimized variant of
-> [the `virtualenv` library](https://virtualenv.pypa.io/en/stable/index.html)).
->
-> There's also a note at the end of these instructions that talks about
-> using `sudo` within a python virtual environment.
-
-### Python2
-
-```shell
-sudo apt-get install python-dev libboost-python-dev python-pip
-```
-
-Next, install some up-to-date python packages.
-
-```shell
-python -m pip install --upgrade pip setuptools
-```
-
-### Python3
-
-```shell
-sudo apt-get install python3-dev libboost-python-dev python3-pip
-```
-
-## Installation
-
-> [!note]
-> If using **older versions of RF24* libraries** with python3,
-> the setup.py script needed a manually created symlink for the boost.python library.
-> ```shell
-> sudo ln -s $(ls /usr/lib/$(ls /usr/lib/gcc | tail -1)/libboost_python3*.so | tail -1) /usr/lib/$(ls /usr/lib/gcc | tail -1)/libboost_python3.so
-> ```
-> This is no longer needed with the latest versions of RF24 libraries.
-
-1. Install the library.
-
- This step needs to be executed from the appropriate directory of
- the cloned RF24* repository:
- - navigate to *pyRF24* directory in the RF24 cloned repository
- - navigate to *RPi/pyRF24Network* directory in the RF24Network cloned repository
- - navigate to *pyRF24Mesh* directory in the RF24Mesh cloned repository
-
- When in the correct directory, run the following command:
- ```shell
- python3 -m pip install -v .
- ```
- @note Building/installing takes several minutes on arm-based machines.
- Machines with RAM less than 1GB may need to increase amount of swap for build.
- The `-v` option enables pip's verbose output to show that the process has not frozen.
-
- See the additional [Platform Support pages](pages.html) for information on connecting your hardware.
-
- See the included [\*.py files in the "examples_linux" folder](examples.html) for usage information.
-2. Running the Example
-
- The python examples location differ for each RF24* repositories.
- - navigate to *examples_linux* directory in the RF24 cloned repository
- - navigate to *RPi/pyRF24Network/examples* directory in the RF24Network cloned repository
- - navigate to *examples_RPi* directory in the RF24Mesh cloned repository
-
- Navigate to the examples_linux directory
- ```shell
- cd ../examples_linux
- ```
- Edit the getting_started.py example to configure the appropriate pins per the [Linux/RPi General](rpi_general.md) documentation.
- ```shell
- nano getting_started.py
- ```
- Configure another device, Arduino or RPi with the same example code. It could be C++ or python (see the [list of available examples](examples.html)), but we'll use the same example file on a different device in this tutorial.
-
- Run the example
- ```shell
- python getting_started.py
- ```
- or for python3
- ```shell
- python3 getting_started.py
- ```
-
- @note
- @parblock
- Running the python wrappers built with 'pigpio' or 'RPi' drivers requires `sudo` permission.
-
- If you are working in a python virtual environment (aka "venv"), then the
- virtual environment's python executable must be specified after `sudo`. Otherwise,
- `sudo` may invoke the system-installed python executable which can lead to errors.
-
- Assuming the python virtual environment is located in `~/venv`, use the following command:
- ```
- sudo ~/venv/bin/python getting_started.py
- ```
- This `sudo` advice must be observed even while the virtual environment is activated.
-
- See more information about python virtual environments in the
- [python documentation](https://docs.python.org/3/library/venv.html).
- @endparblock
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/rpi_general.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/rpi_general.md
deleted file mode 100644
index d7d1172..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/rpi_general.md
+++ /dev/null
@@ -1,120 +0,0 @@
-# Linux General/Raspberry Pi
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 -->
-RF24 supports a variety of Linux based devices via various drivers. Some boards like RPi can utilize multiple methods
-to drive the GPIO and SPI functionality.
-
-## Potential PreConfiguration
-
-If SPI is not already enabled, load it on boot:
-
-```shell
-sudo raspi-config
-```
-
-1. Update the tool via the menu as required
-2. Select **Advanced** and **enable the SPI kernel module**
-3. Update other software and libraries
- ```shell
- sudo apt-get update
- sudo apt-get upgrade
- ```
-
-## Build Options
-
-The default build on Raspberry Pi utilizes the included **BCM2835** driver from [the BCM2835 Library](http://www.airspayce.com/mikem/bcm2835)
-
-1. See [the Linux section for automated installation](linux_install.md).
-2. Manual install:
- ```shell
- make
- sudo make install
- ```
-
-## Connections and Pin Configuration
-
-Using pin 15(GPIO22) for CE, pin 24(GPIO8 commonly labeled as CE0) for CSN
-
-Can use any available SPI BUS for CSN.
-
-In general, use
-
-```cpp
-RF24 radio(<ce_pin>, <a>*10+<b>);
-```
-
-for proper constructor to address the correct spi device at /dev/spidev\<a\>.\<b\>
-
-Choose any GPIO output pin for radio CE pin.
-
-> [!WARNING]
-> The pin numbers may be different for certain systems.
-> In this library's examples, we use the BCM pin numbers for BroadCom chips such as
-> those used on all Raspberry Pi models.
->
-> For Raspberry Pi clones, such as Orange Pi or Banana Pi, defer to the pin numbers described
-> in their corresponding documentation/manual.
->
-> Hint: If libgpiod is installed (not required for this library),
-> then you can use the included
-> [CLI tools shipped with libgpiod](https://libgpiod.readthedocs.io/en/latest/gpio_tools.html)
-> to gleam system-specific details.
-
-### Linux kernel (SPIDEV driver) and the GPIO chip number
-
-This RF24 library, as of v1.4.9, uses the Linux kernel's Character Device API to interface
-with GPIO pins (AKA "lines" in kernel docs). Previous versions used the deprecated "sys fs" interface.
-
-By default, this library attempts to use pins exposed via `/dev/gpiochip0`.
-Some systems have multiple public-facing GPIO chips integrated (ie nVidia Jetson series).
-If your system exposes the desired GPIO pins via a different chip (ie `/dev/gpiochip4`), then the
-`RF24_LINUX_GPIO_CHIP` can be set to the correct value when compiling the library.
-
-```shell
-cmake .. -DRF24_LINUX_GPIO_CHIP="/dev/gpiochip4"
-```
-
-### General
-
-```cpp
-RF24 radio(22, 0);
-```
-
-### MRAA Constructor
-
-```cpp
-RF24 radio(15, 0);
-```
-
-See [the MRAA documentation for Raspberry Pi support](http://iotdk.intel.com/docs/master/mraa/rasppi.html)
-
-### SPI_DEV Constructor
-
-```cpp
-RF24 radio(22, 0);
-```
-
-See [the Raspberry Pi documentation about the GPIO pins](https://www.raspberrypi.com/documentation/computers/os.html#gpio-and-the-40-pin-header)
-
-### Pins
-
-| PIN | NRF24L01 | RPI | RPi -P1 Connector |
-| --- | -------- | ---------- | ----------------- |
-| 1 | GND | rpi-gnd | (25) |
-| 2 | VCC | rpi-3v3 | (17) |
-| 3 | CE | rpi-gpio22 | (15) |
-| 4 | CSN | rpi-gpio8 | (24) |
-| 5 | SCK | rpi-sclk | (23) |
-| 6 | MOSI | rpi-mosi | (19) |
-| 7 | MISO | rpi-miso | (21) |
-| 8 | IRQ | - | - |
-
-## brief history of RF24 library lineage
-
-Based on the arduino lib from [J. Coliz](maniacbug@ymail.com),
-the library was berryfied by [Purinda Gunasekara](purinda@gmail.com)
-then forked from github [stanleyseow/RF24](https://github.com/stanleyseow/RF24) to [jscrane/RF24-rpi](https://github.com/jscrane/RF24-rpi)
-
-Network lib also based on [farconada/RF24Network](https://github.com/farconada/RF24Network)
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/using_cmake.md b/.pio/libdeps/esp32-s3-n16r8/RF24/docs/using_cmake.md
deleted file mode 100644
index ed2780a..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/docs/using_cmake.md
+++ /dev/null
@@ -1,249 +0,0 @@
-# Using CMake
-
-@tableofcontents
-
-<!-- markdownlint-disable MD031 -->
-A more modern approach instead of using hand-crafted _Makefiles_ & _configure_ scripts
-to build & install software. Please note that these instructions are not needed if you
-have already installed the library using [these older instructions](linux_install.md)
-
-## Installing the library
-
-You can install the library in a few different ways.
-
-- Building and installing the library from source code is preferable since it will include all the latest changes.
-- Installing the library (via a package manager) from a pre-built package is mostly for cross-compiling purposes, but it can be useful for environments that don't have all the build-time dependencies (namely CMake).
-
-@warning If you have previously installed the library from source code using the
-[the older instructions](linux_install.md), then you will need to
-uninstall it manually to avoid runtime conflicts.
-```shell
-sudo rm /usr/local/lib/librf24.*
-sudo rm /usr/local/lib/librf24-bcm.so
-sudo rm -r /usr/local/include/RF24
-```
-
-The _librf24-bcm.so_ file may not exist if you used CMake to install the library.
-
-### Automatic Installation
-
-There is a newer automatic install script that makes use of the CMake approach.
-
-1. Download the install.sh file from [https://github.com/nRF24/.github/blob/main/installer/install.sh](https://github.com/nRF24/.github/blob/main/installer/install.sh)
- ```shell
- wget https://raw.githubusercontent.com/nRF24/.github/main/installer/install.sh
- ```
-2. Make it executable
- ```shell
- chmod +x install.sh
- ```
-3. Run it and choose your options
- ```shell
- ./install.sh
- ```
-
- @warning
- `SPIDEV` is now always selected as the default driver because
- all other Linux drivers are being removed in the future.
- See [RF24 issue #971](https://github.com/nRF24/RF24/issues/971) for rationale.
-
- It will also ask to install a python package named [pyRF24](https://github.com/nRF24/pyRF24).
- This is not the same as the traditionally provided python wrappers as the pyRF24 package can be
- used independent of the C++ installed libraries. For more information on this newer python
- package, please check out [the pyRF24 documentation](https://nrf24.github.io/pyRF24/).
-4. Try an example from one of the libraries
- ```shell
- cd ~/rf24libs/RF24/examples_linux
- ```
-
- Edit the gettingstarted example, to set your pin configuration
- ```shell
- nano gettingstarted.cpp
- ```
-
- Build the examples. Remember to set the `RF24_DRIVER` option according to the one that was
- selected during the scripted install.
- ```shell
- mkdir build && cd build
- cmake .. -D RF24_DRIVER=SPIDEV
- make
- ```
-
- Run the example
- ```shell
- sudo ./gettingstarted
- ```
-
-### Building from source code
-
-1. Install prerequisites if there are any (PiGPIO, WiringPi, MRAA, LittleWire libraries, and enable the SPI bus(es) in the OS).
-
- CMake may need to be installed
- ```shell
- sudo apt-get install cmake
- ```
- @note See the [MRAA documentation](http://iotdk.intel.com/docs/master/mraa/index.html) for more information on installing MRAA.
-2. Make a directory to contain the RF24 library and possibly other RF24\* libraries and enter it
- ```shell
- mkdir ~/rf24libs
- cd ~/rf24libs
- ```
-3. Clone the [RF24 repo](https://github.com/nRF24/RF24) and navigate to it
- ```shell
- git clone https://github.com/nRF24/RF24.git RF24
- cd RF24
- ```
-4. Create a build directory inside the RF24 directory and navigate to it.
- ```shell
- mkdir build
- cd build
- ```
-5. Configure build environment
-
- @note When using these instructions to install RF24Mesh, RF24Network, or RF24Gateway,
- the following `RF24_DRIVER` option is only needed for the RF24 library and
- examples as well as the examples for RF24Network, RF24Mesh, and RF24Gateway. The `RF24_DRIVER`
- option is not needed when installing the libraries for RF24Network, RF24Mesh, and RF24Gateway.
-
- Instead of specifying the `RF24_DRIVER` option in the CLI, it is recommended to use a environment
- variable named `RF24_DRIVER`.
-
- ```shell
- export RF24_DRIVER=SPIDEV
- ```
-
- These instructions assume you have not set an environment variable.
-
- ```shell
- cmake .. -D RF24_DRIVER=SPIDEV
- ```
- Instead of using `SPIDEV` driver (recommended), you can also specify the `RPi`, `wiringPi`,
- `MRAA`, or `LittleWire` as alternative drivers.
-
- @warning
- `SPIDEV` is now always selected as the default driver because
- all other Linux drivers are being removed in the future.
- See [RF24 issue #971](https://github.com/nRF24/RF24/issues/971) for rationale.
-6. Build and install the library
- ```shell
- make
- sudo make install
- ```
-7. Build the examples
-
- Navigate to the _examples_linux_ directory
- ```shell
- cd ../examples_linux
- ```
- Make sure the pins used in the examples match the pins you used to connect the radio module
- ```shell
- nano gettingstarted.cpp
- ```
- and edit the pin numbers as directed in the [linux/RPi general documentation](rpi_general.md).
- Create a build directory in the examples_linux directory and navigate to it.
- ```shell
- mkdir build
- cd build
- ```
- Now you are ready to build the examples.
- ```shell
- cmake ..
- make
- ```
- If using the `MRAA` or `wiringPi` drivers, then you may need to specify the `RF24_DRIVER`
- option again.
- ```shell
- cmake .. -D RF24_DRIVER=wiringPi
- make
- ```
-
- Remember that the `RF24_DRIVER` option is needed for the RF24Network, RF24Mesh, and RF24Gateway
- examples if you specified that option (via CLI or environment variable) when installing the
- RF24 library and examples.
-8. Run an example file
- ```shell
- sudo ./gettingstarted
- ```
-
-### Using a package manager
-
-The RF24 library now (as of v1.4.1) has pre-built packages (.deb or .rpm files) that
-can be installed on a Raspberry Pi. These packages can be found on the library's
-[GitHub release page](https://GitHub.com/nRF24/RF24/releases)
-
-1. Download the appropriate package for your machine
-
- Go to the library's [GitHub release page](https://GitHub.com/nRF24/RF24/releases), and look for
- the latest release's assets.
-
- For all Raspberry Pi variants using the Raspberry Pi OS (aka Raspbian), you need the file marked
- for _armhf_ architecture.
-
- For Raspberry Pi variants using a 64-bit OS (like Ubuntu), you need the file marked for
- _arm64_ architecture.
-
- Notice that the filenames will include the name of the utility driver that the package was built with.
- This does not mean that the LittleWire, MRAA, or wiringPi libraries are included in the package (you will still
- need to install those yourself beforehand).
-2. Install the downloaded pkg
-
- If you downloaded the file directly from your target machine using the desktop environment, then
- you only need to double-click the package (deb or rpm) file, and the OS should do the rest.
-
- If you downloaded the file remotely and want to copy it over ssh, then use the `scp` command in a terminal.
- ```shell
- scp pkg_filename.deb pi@host_name:~/Downloads
- ```
- @note You do not need to do this from within an ssh session. Also, you can use the target machine's IP
- address instead of its host name.
-
- The `scp` command will ask you for a password belonging to the user's name on the remote machine (we used
- `pi` in the above example).
-
- Now you can open up a ssh session and install the copied package from the terminal.
- ```shell
- ssh pi@host_name
- cd Downloads
- dpkg -i pkg_filename.deb
- ```
-
-## Cross-compiling the library
-
-The RF24 library comes with some pre-made toolchain files (located in the
-_RF24/cmake/toolchains_ directory) to use in CMake. To use these toolchain files,
-additional command line options are needed when configuring CMake to build the library
-(step 5 in the above instructions to build from source).
-
-```shell
-cmake .. -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/armhf.cmake
-make
-```
-
-If you plan on using the cross-compiled library with your personal cross-compiled
-project, then it is advised to specify the path that your project will look in when
-linking to the RF24 library:
-
-```shell
-cmake .. -D CMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/armhf.cmake
-make
-sudo make install
-```
-
-Remember to also specify the `RF24_DRIVER` option (via CLI or environment variable) if
-not using the auto-configuration feature (see step 5 in the above instructions to build
-from source).
-
-### Installing the library remotely
-
-To install remotely, you can create an installable package file using CMake's built-in
-program called CPack.
-
-```shell
-cmake .. -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/armhf.cmake
-make
-cpack
-```
-
-This will create a deb file and a rpm file in a new sub-directory called "pkgs" within
-the build directory. You can use either of these packages to install the library to
-your target machine (see the above instructions about using a package manager).
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/.clang-format b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/.clang-format
deleted file mode 100644
index f95490c..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/.clang-format
+++ /dev/null
@@ -1,145 +0,0 @@
-# See: https://releases.llvm.org/11.0.1/tools/clang/docs/ClangFormatStyleOptions.html
----
-Language: Cpp
-# LLVM is the default style setting, used when a configuration option is not set here
-BasedOnStyle: LLVM
-AccessModifierOffset: -2
-AlignAfterOpenBracket: Align
-AlignConsecutiveAssignments: false
-AlignConsecutiveBitFields: false
-AlignConsecutiveDeclarations: false
-AlignConsecutiveMacros: false
-AlignEscapedNewlines: DontAlign
-AlignOperands: Align
-AlignTrailingComments: true
-AllowAllArgumentsOnNextLine: true
-AllowAllConstructorInitializersOnNextLine: true
-AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: Always
-AllowShortCaseLabelsOnASingleLine: true
-AllowShortEnumsOnASingleLine: true
-AllowShortFunctionsOnASingleLine: Empty
-AllowShortIfStatementsOnASingleLine: Always
-AllowShortLambdasOnASingleLine: Empty
-AllowShortLoopsOnASingleLine: true
-AlwaysBreakAfterDefinitionReturnType: None
-AlwaysBreakAfterReturnType: None
-AlwaysBreakBeforeMultilineStrings: false
-AlwaysBreakTemplateDeclarations: No
-BinPackArguments: true
-BinPackParameters: true
-# Only used when "BreakBeforeBraces" set to "Custom"
-BraceWrapping:
- AfterCaseLabel: false
- AfterClass: false
- AfterControlStatement: Never
- AfterEnum: false
- AfterFunction: false
- AfterNamespace: false
- #AfterObjCDeclaration:
- AfterStruct: false
- AfterUnion: false
- AfterExternBlock: false
- BeforeCatch: false
- BeforeElse: false
- BeforeLambdaBody: false
- BeforeWhile: false
- IndentBraces: false
- SplitEmptyFunction: false
- SplitEmptyRecord: false
- SplitEmptyNamespace: false
-# Java-specific
-#BreakAfterJavaFieldAnnotations:
-BreakBeforeBinaryOperators: NonAssignment
-BreakBeforeBraces: Attach
-BreakBeforeTernaryOperators: true
-BreakConstructorInitializers: BeforeColon
-BreakInheritanceList: BeforeColon
-BreakStringLiterals: false
-ColumnLimit: 0
-# "" matches none
-CommentPragmas: ""
-CompactNamespaces: false
-ConstructorInitializerAllOnOneLineOrOnePerLine: true
-ConstructorInitializerIndentWidth: 2
-ContinuationIndentWidth: 2
-Cpp11BracedListStyle: false
-DeriveLineEnding: true
-DerivePointerAlignment: true
-DisableFormat: false
-# Docs say "Do not use this in config files". The default (LLVM 11.0.1) is "false".
-#ExperimentalAutoDetectBinPacking:
-FixNamespaceComments: false
-ForEachMacros: []
-IncludeBlocks: Preserve
-IncludeCategories: []
-# "" matches none
-IncludeIsMainRegex: ""
-IncludeIsMainSourceRegex: ""
-IndentCaseBlocks: true
-IndentCaseLabels: true
-IndentExternBlock: Indent
-IndentGotoLabels: false
-IndentPPDirectives: None
-IndentWidth: 2
-IndentWrappedFunctionNames: false
-InsertTrailingCommas: None
-# Java-specific
-#JavaImportGroups:
-# JavaScript-specific
-#JavaScriptQuotes:
-#JavaScriptWrapImports
-KeepEmptyLinesAtTheStartOfBlocks: true
-MacroBlockBegin: ""
-MacroBlockEnd: ""
-# Set to a large number to effectively disable
-MaxEmptyLinesToKeep: 100000
-NamespaceIndentation: None
-NamespaceMacros: []
-# Objective C-specific
-#ObjCBinPackProtocolList:
-#ObjCBlockIndentWidth:
-#ObjCBreakBeforeNestedBlockParam:
-#ObjCSpaceAfterProperty:
-#ObjCSpaceBeforeProtocolList
-PenaltyBreakAssignment: 1
-PenaltyBreakBeforeFirstCallParameter: 1
-PenaltyBreakComment: 1
-PenaltyBreakFirstLessLess: 1
-PenaltyBreakString: 1
-PenaltyBreakTemplateDeclaration: 1
-PenaltyExcessCharacter: 1
-PenaltyReturnTypeOnItsOwnLine: 1
-# Used as a fallback if alignment style can't be detected from code (DerivePointerAlignment: true)
-PointerAlignment: Right
-RawStringFormats: []
-ReflowComments: false
-SortIncludes: false
-SortUsingDeclarations: false
-SpaceAfterCStyleCast: false
-SpaceAfterLogicalNot: false
-SpaceAfterTemplateKeyword: false
-SpaceBeforeAssignmentOperators: true
-SpaceBeforeCpp11BracedList: false
-SpaceBeforeCtorInitializerColon: true
-SpaceBeforeInheritanceColon: true
-SpaceBeforeParens: ControlStatements
-SpaceBeforeRangeBasedForLoopColon: true
-SpaceBeforeSquareBrackets: false
-SpaceInEmptyBlock: false
-SpaceInEmptyParentheses: false
-SpacesBeforeTrailingComments: 2
-SpacesInAngles: false
-SpacesInCStyleCastParentheses: false
-SpacesInConditionalStatement: false
-SpacesInContainerLiterals: false
-SpacesInParentheses: false
-SpacesInSquareBrackets: false
-Standard: Auto
-StatementMacros: []
-TabWidth: 2
-TypenameMacros: []
-# Default to LF if line endings can't be detected from the content (DeriveLineEnding).
-UseCRLF: false
-UseTab: Never
-WhitespaceSensitiveMacros: []
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/AcknowledgementPayloads/AcknowledgementPayloads.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/AcknowledgementPayloads/AcknowledgementPayloads.ino
deleted file mode 100644
index af0d7db..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/AcknowledgementPayloads/AcknowledgementPayloads.ino
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * Author: Brendan Doherty (2bndy5)
- */
-
-/**
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with Acknowledgement (ACK) payloads attached to ACK packets.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-#include <SPI.h>
-#include "printf.h"
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// an identifying device destination
-// Let these addresses be used for the pair
-uint8_t address[][6] = { "1Node", "2Node" };
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-// to use different addresses on a pair of radios, we need a variable to
-
-// uniquely identify which address this radio will use to transmit
-bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
-
-// Used to control whether this node is sending or receiving
-bool role = false; // true = TX role, false = RX role
-
-// For this example, we'll be using a payload containing
-// a string & an integer number that will be incremented
-// on every successful transmission.
-// Make a data structure to store the entire payload of different datatypes
-struct PayloadStruct {
- char message[7]; // only using 6 characters for TX & ACK payloads
- uint8_t counter;
-};
-PayloadStruct payload;
-
-void setup() {
-
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/AcknowledgementPayloads"));
-
- // To set the radioNumber via the Serial monitor on startup
- Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'"));
- while (!Serial.available()) {
- // wait for user input
- }
- char input = Serial.parseInt();
- radioNumber = input == 1;
- Serial.print(F("radioNumber = "));
- Serial.println((int)radioNumber);
-
- // role variable is hardcoded to RX behavior, inform the user of this
- Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity to
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // to use ACK payloads, we need to enable dynamic payload lengths (for all nodes)
- radio.enableDynamicPayloads(); // ACK payloads are dynamically sized
-
- // Acknowledgement packets have no payloads by default. We need to enable
- // this feature for all nodes (TX & RX) to use ACK payloads.
- radio.enableAckPayload();
-
- // set the TX address of the RX node for use on the TX pipe (pipe 0)
- radio.stopListening(address[radioNumber]); // put radio in TX mode
-
- // set the RX address of the TX node into a RX pipe
- radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
-
- // additional setup specific to the node's role
- if (role) {
- // setup the TX payload
- memcpy(payload.message, "Hello ", 6); // set the payload message
- } else {
- // setup the ACK payload & load the first response into the FIFO
-
- memcpy(payload.message, "World ", 6); // set the payload message
- // load the payload for the first received transmission on pipe 0
- radio.writeAckPayload(1, &payload, sizeof(payload));
-
- radio.startListening(); // put radio in RX mode
- }
-
- // For debugging info
- // printf_begin(); // needed only once for printing details
- // radio.printDetails(); // (smaller) function that prints raw register values
- // radio.printPrettyDetails(); // (larger) function that prints human readable data
-}
-
-void loop() {
-
- if (role) {
- // This device is a TX node
-
- unsigned long start_timer = micros(); // start the timer
- bool report = radio.write(&payload, sizeof(payload)); // transmit & save the report
- unsigned long end_timer = micros(); // end the timer
-
- if (report) {
- Serial.print(F("Transmission successful! ")); // payload was delivered
- Serial.print(F("Time to transmit = "));
- Serial.print(end_timer - start_timer); // print the timer result
- Serial.print(F(" us. Sent: "));
- Serial.print(payload.message); // print the outgoing message
- Serial.print(payload.counter); // print the outgoing counter
- uint8_t pipe;
- if (radio.available(&pipe)) { // is there an ACK payload? grab the pipe number that received it
- PayloadStruct received;
- radio.read(&received, sizeof(received)); // get incoming ACK payload
- Serial.print(F(" Received "));
- Serial.print(radio.getDynamicPayloadSize()); // print incoming payload size
- Serial.print(F(" bytes on pipe "));
- Serial.print(pipe); // print pipe number that received the ACK
- Serial.print(F(": "));
- Serial.print(received.message); // print incoming message
- Serial.println(received.counter); // print incoming counter
-
- // save incoming counter & increment for next outgoing
- payload.counter = received.counter + 1;
-
- } else {
- Serial.println(F(" Received: an empty ACK packet")); // empty ACK packet received
- }
-
-
- } else {
- Serial.println(F("Transmission failed or timed out")); // payload was not delivered
- }
-
- // to make this example readable in the serial monitor
- delay(1000); // slow transmissions down by 1 second
-
- } else {
- // This device is a RX node
-
- uint8_t pipe;
- if (radio.available(&pipe)) { // is there a payload? get the pipe number that received it
- uint8_t bytes = radio.getDynamicPayloadSize(); // get the size of the payload
- PayloadStruct received;
- radio.read(&received, sizeof(received)); // get incoming payload
- Serial.print(F("Received "));
- Serial.print(bytes); // print the size of the payload
- Serial.print(F(" bytes on pipe "));
- Serial.print(pipe); // print the pipe number
- Serial.print(F(": "));
- Serial.print(received.message); // print incoming message
- Serial.print(received.counter); // print incoming counter
- Serial.print(F(" Sent: "));
- Serial.print(payload.message); // print outgoing message
- Serial.println(payload.counter); // print outgoing counter
-
- // save incoming counter & increment for next outgoing
- payload.counter = received.counter + 1;
- // load the payload for the first received transmission on pipe 0
- radio.writeAckPayload(1, &payload, sizeof(payload));
- }
- } // role
-
- if (Serial.available()) {
- // change the role via the serial monitor
-
- char c = toupper(Serial.read());
- if (c == 'T' && !role) {
- // Become the TX node
-
- role = true;
- Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
-
- memcpy(payload.message, "Hello ", 6); // change payload message
- radio.stopListening(); // this also discards any unused ACK payloads
-
- } else if (c == 'R' && role) {
- // Become the RX node
-
- role = false;
- Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
- memcpy(payload.message, "World ", 6); // change payload message
-
- // load the payload for the first received transmission on pipe 0
- radio.writeAckPayload(1, &payload, sizeof(payload));
- radio.startListening();
- }
- }
-} // loop
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/GettingStarted/GettingStarted.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/GettingStarted/GettingStarted.ino
deleted file mode 100644
index 8273457..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/GettingStarted/GettingStarted.ino
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * Author: Brendan Doherty (2bndy5)
- */
-
-/**
- * A simple example of sending data from 1 nRF24L01 transceiver to another.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-#include <SPI.h>
-#include "printf.h"
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// Let these addresses be used for the pair
-uint8_t address[][6] = { "1Node", "2Node" };
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-
-// to use different addresses on a pair of radios, we need a variable to
-// uniquely identify which address this radio will use to transmit
-bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
-
-// Used to control whether this node is sending or receiving
-bool role = false; // true = TX role, false = RX role
-
-// For this example, we'll be using a payload containing
-// a single float number that will be incremented
-// on every successful transmission
-float payload = 0.0;
-
-void setup() {
-
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/GettingStarted"));
-
- // To set the radioNumber via the Serial monitor on startup
- Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'"));
- while (!Serial.available()) {
- // wait for user input
- }
- char input = Serial.parseInt();
- radioNumber = input == 1;
- Serial.print(F("radioNumber = "));
- Serial.println((int)radioNumber);
-
- // role variable is hardcoded to RX behavior, inform the user of this
- Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity to
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // save on transmission time by setting the radio to only transmit the
- // number of bytes we need to transmit a float
- radio.setPayloadSize(sizeof(payload)); // float datatype occupies 4 bytes
-
- // set the TX address of the RX node for use on the TX pipe (pipe 0)
- radio.stopListening(address[radioNumber]); // put radio in TX mode
-
- // set the RX address of the TX node into a RX pipe
- radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
-
- // additional setup specific to the node's RX role
- if (!role) {
- radio.startListening(); // put radio in RX mode
- }
-
- // For debugging info
- // printf_begin(); // needed only once for printing details
- // radio.printDetails(); // (smaller) function that prints raw register values
- // radio.printPrettyDetails(); // (larger) function that prints human readable data
-
-} // setup
-
-void loop() {
-
- if (role) {
- // This device is a TX node
-
- unsigned long start_timer = micros(); // start the timer
- bool report = radio.write(&payload, sizeof(float)); // transmit & save the report
- unsigned long end_timer = micros(); // end the timer
-
- if (report) {
- Serial.print(F("Transmission successful! ")); // payload was delivered
- Serial.print(F("Time to transmit = "));
- Serial.print(end_timer - start_timer); // print the timer result
- Serial.print(F(" us. Sent: "));
- Serial.println(payload); // print payload sent
- payload += 0.01; // increment float payload
- } else {
- Serial.println(F("Transmission failed or timed out")); // payload was not delivered
- }
-
- // to make this example readable in the serial monitor
- delay(1000); // slow transmissions down by 1 second
-
- } else {
- // This device is a RX node
-
- uint8_t pipe;
- if (radio.available(&pipe)) { // is there a payload? get the pipe number that received it
- uint8_t bytes = radio.getPayloadSize(); // get the size of the payload
- radio.read(&payload, bytes); // fetch payload from FIFO
- Serial.print(F("Received "));
- Serial.print(bytes); // print the size of the payload
- Serial.print(F(" bytes on pipe "));
- Serial.print(pipe); // print the pipe number
- Serial.print(F(": "));
- Serial.println(payload); // print the payload's value
- }
- } // role
-
- if (Serial.available()) {
- // change the role via the serial monitor
-
- char c = toupper(Serial.read());
- if (c == 'T' && !role) {
- // Become the TX node
-
- role = true;
- Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
- radio.stopListening();
-
- } else if (c == 'R' && role) {
- // Become the RX node
-
- role = false;
- Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
- radio.startListening();
- }
- }
-
-} // loop
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/InterruptConfigure/InterruptConfigure.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/InterruptConfigure/InterruptConfigure.ino
deleted file mode 100644
index 9d59759..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/InterruptConfigure/InterruptConfigure.ino
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * Author: Brendan Doherty (2bndy5)
- */
-
-/**
- * This example uses Acknowledgement (ACK) payloads attached to ACK packets to
- * demonstrate how the nRF24L01's IRQ (Interrupt Request) pin can be
- * configured to detect when data is received, or when data has transmitted
- * successfully, or when data has failed to transmit.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-#include <SPI.h>
-#include "printf.h"
-#include "RF24.h"
-
-// We will be using the nRF24L01's IRQ pin for this example
-#define IRQ_PIN 2 // this needs to be a digital input capable pin
-volatile bool got_interrupt = false; // used to signal processing of interrupt
-volatile bool wait_for_event = false; // used to wait for an IRQ event to trigger
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// Let these addresses be used for the pair
-uint8_t address[][6] = { "1Node", "2Node" };
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-
-// to use different addresses on a pair of radios, we need a variable to
-// uniquely identify which address this radio will use to transmit
-bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
-
-// Used to control whether this node is sending or receiving
-bool role = false; // true = TX node, false = RX node
-
-// For this example, we'll be using a payload containing
-// a string that changes on every transmission. (successful or not)
-// Make a couple arrays of payloads & an iterator to traverse them
-const uint8_t tx_pl_size = 5;
-const uint8_t ack_pl_size = 4;
-uint8_t pl_iterator = 0;
-// The " + 1" compensates for the c-string's NULL terminating 0
-char tx_payloads[][tx_pl_size + 1] = { "Ping ", "Pong ", "Radio", "1FAIL" };
-char ack_payloads[][ack_pl_size + 1] = { "Yak ", "Back", " ACK" };
-
-void interruptHandler(); // prototype to handle IRQ events
-void printRxFifo(); // prototype to print RX FIFO with 1 buffer
-
-
-void setup() {
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/InterruptConfigure"));
-
- // To set the radioNumber via the Serial monitor on startup
- Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'"));
- while (!Serial.available()) {
- // wait for user input
- }
- char input = Serial.parseInt();
- radioNumber = input == 1;
- Serial.print(F("radioNumber = "));
- Serial.println((int)radioNumber);
-
- // role variable is hardcoded to RX behavior, inform the user of this
- Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
-
- // setup the IRQ_PIN
- pinMode(IRQ_PIN, INPUT);
- attachInterrupt(digitalPinToInterrupt(IRQ_PIN), interruptHandler, FALLING);
- // IMPORTANT: do not call radio.available() before calling
- // radio.whatHappened() when the interruptHandler() is triggered by the
- // IRQ pin FALLING event. According to the datasheet, the pipe information
- // is unreliable during the IRQ pin FALLING transition.
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity to
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // For this example we use acknowledgment (ACK) payloads to trigger the
- // IRQ pin when data is received on the TX node.
- // to use ACK payloads, we need to enable dynamic payload lengths
- radio.enableDynamicPayloads(); // ACK payloads are dynamically sized
-
- // Acknowledgement packets have no payloads by default. We need to enable
- // this feature for all nodes (TX & RX) to use ACK payloads.
- radio.enableAckPayload();
-
- // set the TX address of the RX node for use on the TX pipe (pipe 0)
- radio.stopListening(address[radioNumber]); // put radio in TX mode
-
- // set the RX address of the TX node into a RX pipe
- radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
-
- // additional setup specific to the node's RX role
- if (!role) {
- // setup for RX mode
-
- // let IRQ pin only trigger on "data_ready" event in RX mode
- radio.setStatusFlags(RF24_RX_DR);
-
- // Fill the TX FIFO with 3 ACK payloads for the first 3 received
- // transmissions on pipe 1
- radio.writeAckPayload(1, &ack_payloads[0], ack_pl_size);
- radio.writeAckPayload(1, &ack_payloads[1], ack_pl_size);
- radio.writeAckPayload(1, &ack_payloads[2], ack_pl_size);
-
- radio.startListening(); // put radio in RX mode
- }
-
- // For debugging info
- // printf_begin(); // needed only once for printing details
- // radio.printDetails(); // (smaller) function that prints raw register values
- // radio.printPrettyDetails(); // (larger) function that prints human readable data
-}
-
-void loop() {
- if (got_interrupt) {
- assessInterruptEvent();
- }
-
- if (role && !wait_for_event) {
-
- // This device is a TX node. This if block is only triggered when
- // NOT waiting for an IRQ event to happen
-
- if (pl_iterator == 0) {
- // Test the "data ready" event with the IRQ pin
-
- Serial.println(F("\nConfiguring IRQ pin to ignore the 'data sent' event"));
- radio.setStatusFlags(RF24_RX_DR | RF24_TX_DF);
- Serial.println(F(" Pinging RX node for 'data ready' event..."));
-
- } else if (pl_iterator == 1) {
- // Test the "data sent" event with the IRQ pin
-
- Serial.println(F("\nConfiguring IRQ pin to ignore the 'data ready' event"));
- radio.setStatusFlags(RF24_TX_DS | RF24_TX_DF);
- Serial.println(F(" Pinging RX node for 'data sent' event..."));
-
- } else if (pl_iterator == 2) {
- // Use this iteration to fill the RX node's FIFO which sets us up for the next test.
-
- // write() uses virtual interrupt flags that work despite the masking of the IRQ pin
- // disable IRQ pin for this step
- radio.setStatusFlags();
-
- Serial.println(F("\nSending 1 payload to fill RX node's FIFO. IRQ pin is neglected."));
- // write() will call flush_tx() on 'data fail' events
- if (radio.write(&tx_payloads[pl_iterator], tx_pl_size)) {
- if (radio.rxFifoFull()) {
- Serial.println(F("RX node's FIFO is full; it is not listening any more"));
- } else {
- Serial.println("Transmission successful, but the RX node might still be listening.");
- }
- } else {
- Serial.println(F("Transmission failed or timed out. Continuing anyway."));
- radio.flush_tx(); // discard payload(s) that failed to transmit
- }
-
- } else if (pl_iterator == 3) {
- // test the "data fail" event with the IRQ pin
-
- Serial.println(F("\nConfiguring IRQ pin to reflect all events"));
- radio.setStatusFlags(RF24_IRQ_ALL);
- Serial.println(F(" Pinging inactive RX node for 'data fail' event..."));
- }
-
- if (pl_iterator < 4 && pl_iterator != 2) {
-
- // IRQ pin is LOW when activated. Otherwise it is always HIGH
- // Wait until IRQ pin is activated.
- wait_for_event = true;
-
- // use the non-blocking call to write a payload and begin transmission
- // the "false" argument means we are expecting an ACK packet response
- radio.startFastWrite(tx_payloads[pl_iterator++], tx_pl_size, false);
-
- // In this example, the "data fail" event is always configured to
- // trigger the IRQ pin active. Because the auto-ACK feature is on by
- // default, we don't need a timeout check to prevent an infinite loop.
-
- } else if (pl_iterator == 4) {
- // all IRQ tests are done; flush_tx() and print the ACK payloads for fun
-
- // CE pin is still HIGH which consumes more power. Example is now idling so...
- radio.stopListening(); // ensure CE pin is LOW
- // stopListening() also calls flush_tx() when ACK payloads are enabled
-
- printRxFifo();
- pl_iterator++;
-
-
- // inform user what to do next
- Serial.println(F("\n*** PRESS 'T' to restart the transmissions"));
- Serial.println(F("*** PRESS 'R' to change to Receive role\n"));
-
-
- } else if (pl_iterator == 2) {
- pl_iterator++; // proceed from step 3 to last step (stop at step 4 for readability)
- }
-
- } else if (!role && radio.rxFifoFull()) {
- // This device is a RX node:
- // wait until RX FIFO is full then stop listening
-
- delay(100); // let ACK payload finish transmitting
- radio.stopListening(); // also discards unused ACK payloads
- printRxFifo(); // flush the RX FIFO
-
- // Fill the TX FIFO with 3 ACK payloads for the first 3 received
- // transmissions on pipe 1.
- radio.writeAckPayload(1, &ack_payloads[0], ack_pl_size);
- radio.writeAckPayload(1, &ack_payloads[1], ack_pl_size);
- radio.writeAckPayload(1, &ack_payloads[2], ack_pl_size);
-
- delay(100); // let TX node finish its role
- radio.startListening(); // We're ready to start over. Begin listening.
-
- } // role
-
- if (Serial.available()) {
- // change the role via the serial monitor
-
- char c = toupper(Serial.read());
- if (c == 'T') {
- // Become the TX node
- if (!role)
- Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
- else
- Serial.println(F("*** RESTARTING IRQ PIN TEST ***"));
-
- role = true;
- wait_for_event = false;
- pl_iterator = 0; // reset the iterator
- radio.flush_tx(); // discard any payloads in the TX FIFO
-
- // startListening() clears the IRQ masks also. This is required for
- // continued TX operations when a transmission fails.
- radio.stopListening(); // this also discards any unused ACK payloads
-
- } else if (c == 'R' && role) {
- // Become the RX node
- Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
-
- role = false;
-
- // let IRQ pin only trigger on "data_ready" event in RX mode
- radio.setStatusFlags(RF24_RX_DR);
-
- // Fill the TX FIFO with 3 ACK payloads for the first 3 received
- // transmissions on pipe 1
- radio.flush_tx(); // make sure there is room for 3 new ACK payloads
- radio.flush_rx(); // make sure there is room for 3 incoming payloads
- radio.writeAckPayload(1, &ack_payloads[0], ack_pl_size);
- radio.writeAckPayload(1, &ack_payloads[1], ack_pl_size);
- radio.writeAckPayload(1, &ack_payloads[2], ack_pl_size);
- radio.startListening();
- }
- } // Serial.available()
-} // loop
-
-
-/**
- * when the IRQ pin goes active LOW.
- * Here we just tell the main loop() to call `assessInterruptEve4nt()`.
- */
-void interruptHandler() {
- got_interrupt = true; // forward event handling back to main loop()
-}
-
-/**
- * Called when an event has been triggered.
- * Here, we want to verify the expected IRQ flag has been asserted.
- */
-void assessInterruptEvent() {
- // print IRQ status and all masking flags' states
-
- Serial.println(F("\tIRQ pin is actively LOW")); // show that this function was called
- delayMicroseconds(250);
- uint8_t flags = radio.clearStatusFlags();
- // Resetting the tx_df flag is required for
- // continued TX operations when a transmission fails.
- // clearing the status flags resets the IRQ pin to its inactive state (HIGH)
-
- Serial.print(F("\tdata_sent: "));
- Serial.print((flags & RF24_TX_DS) > 0); // print "data sent" flag state
- Serial.print(F(", data_fail: "));
- Serial.print((flags & RF24_TX_DF) > 0); // print "data fail" flag state
- Serial.print(F(", data_ready: "));
- Serial.println((flags & RF24_RX_DR) > 0); // print "data ready" flag state
-
- if (flags & RF24_TX_DF) // if TX payload failed
- radio.flush_tx(); // clear all payloads from the TX FIFO
-
- // print if test passed or failed. Unintentional fails mean the RX node was not listening.
- // pl_iterator has already been incremented by now
- if (pl_iterator <= 1) {
- Serial.print(F(" 'Data Ready' event test "));
- Serial.println(flags & RF24_RX_DR ? F("passed") : F("failed"));
- } else if (pl_iterator == 2) {
- Serial.print(F(" 'Data Sent' event test "));
- Serial.println(flags & RF24_TX_DS ? F("passed") : F("failed"));
- } else if (pl_iterator == 4) {
- Serial.print(F(" 'Data Fail' event test "));
- Serial.println(flags & RF24_TX_DF ? F("passed") : F("failed"));
- }
- got_interrupt = false; // reset this flag to prevent calling this function from loop()
- wait_for_event = false; // ready to continue with loop() operations
-}
-
-/**
- * Print the entire RX FIFO with one buffer. This will also flush the RX FIFO.
- * Remember that the payload sizes are declared as tx_pl_size and ack_pl_size.
- */
-void printRxFifo() {
- if (radio.available()) { // if there is data in the RX FIFO
- // to flush the data from the RX FIFO, we'll fetch it all using 1 buffer
-
- uint8_t pl_size = !role ? tx_pl_size : ack_pl_size;
- char rx_fifo[pl_size * 3 + 1]; // RX FIFO is full & we know ACK payloads' size
- if (radio.rxFifoFull()) {
- rx_fifo[pl_size * 3] = 0; // add a NULL terminating char to use as a c-string
- radio.read(&rx_fifo, pl_size * 3); // this clears the RX FIFO (for this example)
- } else {
- uint8_t i = 0;
- while (radio.available()) {
- radio.read(&rx_fifo + (i * pl_size), pl_size);
- i++;
- }
- rx_fifo[i * pl_size] = 0; // add a NULL terminating char to use as a c-string
- }
- Serial.print(F("Complete RX FIFO: "));
- Serial.println(rx_fifo); // print the entire RX FIFO with 1 buffer
- }
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/ManualAcknowledgements/ManualAcknowledgements.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/ManualAcknowledgements/ManualAcknowledgements.ino
deleted file mode 100644
index e4fbb38..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/ManualAcknowledgements/ManualAcknowledgements.ino
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * Author: Brendan Doherty (2bndy5)
- */
-
-/**
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with manually transmitted (non-automatic) Acknowledgement (ACK) payloads.
- * This example still uses ACK packets, but they have no payloads. Instead the
- * acknowledging response is sent with `write()`. This tactic allows for more
- * updated acknowledgement payload data, where actual ACK payloads' data are
- * outdated by 1 transmission because they have to loaded before receiving a
- * transmission.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-#include <SPI.h>
-#include "printf.h"
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// Let these addresses be used for the pair
-uint8_t address[][6] = { "1Node", "2Node" };
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-
-// to use different addresses on a pair of radios, we need a variable to
-// uniquely identify which address this radio will use to transmit
-bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
-
-// Used to control whether this node is sending or receiving
-bool role = false; // true = TX node, false = RX node
-
-// For this example, we'll be using a payload containing
-// a string & an integer number that will be incremented
-// on every successful transmission.
-// Make a data structure to store the entire payload of different datatypes
-struct PayloadStruct {
- char message[7]; // only using 6 characters for TX & RX payloads
- uint8_t counter;
-};
-PayloadStruct payload;
-
-void setup() {
-
- // append a NULL terminating character for printing as a c-string
- payload.message[6] = 0;
-
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/ManualAcknowledgements"));
-
- // To set the radioNumber via the Serial monitor on startup
- Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'"));
- while (!Serial.available()) {
- // wait for user input
- }
- char input = Serial.parseInt();
- radioNumber = input == 1;
- Serial.print(F("radioNumber = "));
- Serial.println((int)radioNumber);
-
- // role variable is hardcoded to RX behavior, inform the user of this
- Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity to
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // save on transmission time by setting the radio to only transmit the
- // number of bytes we need to transmit a float
- radio.setPayloadSize(sizeof(payload)); // char[7] & uint8_t datatypes occupy 8 bytes
-
- // set the TX address of the RX node for use on the TX pipe (pipe 0)
- radio.stopListening(address[radioNumber]); // put radio in TX mode
-
- // set the RX address of the TX node into a RX pipe
- radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
-
- if (role) {
- // setup the TX node
-
- memcpy(payload.message, "Hello ", 6); // set the outgoing message
- } else {
- // setup the RX node
-
- memcpy(payload.message, "World ", 6); // set the outgoing message
- radio.startListening(); // put radio in RX mode
- }
-
- // For debugging info
- // printf_begin(); // needed only once for printing details
- // radio.printDetails(); // (smaller) function that prints raw register values
- // radio.printPrettyDetails(); // (larger) function that prints human readable data
-
-} // setup()
-
-void loop() {
-
- if (role) {
- // This device is a TX node
-
- unsigned long start_timer = micros(); // start the timer
- bool report = radio.write(&payload, sizeof(payload)); // transmit & save the report
-
- if (report) {
- // transmission successful; wait for response and print results
-
- radio.startListening(); // put in RX mode
- unsigned long start_timeout = millis(); // timer to detect timeout
- while (!radio.available()) { // wait for response
- if (millis() - start_timeout > 200) // only wait 200 ms
- break;
- delayMicroseconds(200); // relax probing of available()
- }
- unsigned long end_timer = micros(); // end the timer
- radio.stopListening(); // put back in TX mode
-
- // print summary of transactions
- Serial.print(F("Transmission successful!")); // payload was delivered
- uint8_t pipe;
- if (radio.available(&pipe)) { // is there a payload received
- Serial.print(F(" Round-trip delay: "));
- Serial.print(end_timer - start_timer); // print the timer result
- Serial.print(F(" us. Sent: "));
- Serial.print(payload.message); // print the outgoing payload's message
- Serial.print(payload.counter); // print outgoing payload's counter
- PayloadStruct received;
- radio.read(&received, sizeof(received)); // get payload from RX FIFO
- Serial.print(F(" Received "));
- Serial.print(radio.getPayloadSize()); // print the size of the payload
- Serial.print(F(" bytes on pipe "));
- Serial.print(pipe); // print the pipe number
- Serial.print(F(": "));
- Serial.print(received.message); // print the incoming payload's message
- Serial.println(received.counter); // print the incoming payload's counter
- payload.counter = received.counter; // save incoming counter for next outgoing counter
- } else {
- Serial.println(F(" Received no response.")); // no response received
- }
- } else {
- Serial.println(F("Transmission failed or timed out")); // payload was not delivered
- } // report
-
- // to make this example readable in the serial monitor
- delay(1000); // slow transmissions down by 1 second
-
- } else {
- // This device is a RX node
-
- uint8_t pipe;
- if (radio.available(&pipe)) { // is there a payload? get the pipe number that received it
- PayloadStruct received;
- radio.read(&received, sizeof(received)); // get incoming payload
- payload.counter = received.counter + 1; // increment incoming counter for next outgoing response
-
- // transmit response & save result to `report`
- radio.stopListening(); // put in TX mode
-
- radio.writeFast(&payload, sizeof(payload)); // load response to TX FIFO
- bool report = radio.txStandBy(150); // keep retrying for 150 ms
-
- radio.startListening(); // put back in RX mode
-
- // print summary of transactions
- Serial.print(F("Received "));
- Serial.print(radio.getPayloadSize()); // print the size of the payload
- Serial.print(F(" bytes on pipe "));
- Serial.print(pipe); // print the pipe number
- Serial.print(F(": "));
- Serial.print(received.message); // print incoming message
- Serial.print(received.counter); // print incoming counter
-
- if (report) {
- Serial.print(F(" Sent: "));
- Serial.print(payload.message); // print outgoing message
- Serial.println(payload.counter); // print outgoing counter
- } else {
- Serial.println(" Response failed."); // failed to send response
- }
- }
- } // role
-
- if (Serial.available()) {
- // change the role via the serial monitor
-
- char c = toupper(Serial.read());
- if (c == 'T' && !role) {
- // Become the TX node
-
- role = true;
- memcpy(payload.message, "Hello ", 6); // set the outgoing message
- Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
- radio.stopListening(); // put in TX mode
-
- } else if (c == 'R' && role) {
- // Become the RX node
-
- role = false;
- memcpy(payload.message, "World ", 6); // set the response message
- Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
- radio.startListening(); // put in RX mode
- }
- }
-} // loop
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/MulticeiverDemo/MulticeiverDemo.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/MulticeiverDemo/MulticeiverDemo.ino
deleted file mode 100644
index 99295bf..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/MulticeiverDemo/MulticeiverDemo.ino
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * Author: Brendan Doherty 2bndy5
- */
-
-/**
- * A simple example of sending data from as many as 6 nRF24L01 transceivers to
- * 1 receiving transceiver. This technique is trademarked by
- * Nordic Semiconductors as "MultiCeiver".
- *
- * This example was written to be used on up to 6 devices acting as TX nodes &
- * only 1 device acting as the RX node (that's a maximum of 7 devices).
- * Use the Serial Monitor to change each node's behavior.
- */
-#include <SPI.h>
-#include "printf.h"
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// For this example, we'll be using 6 addresses; 1 for each TX node
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-// Notice that the last byte is the only byte that changes in the last 5
-// addresses. This is a limitation of the nRF24L01 transceiver for pipes 2-5
-// because they use the same first 4 MSBytes from pipe 1.
-uint8_t address[6][5] = { { 0x78, 0x78, 0x78, 0x78, 0x78 },
- { 0xF1, 0xB6, 0xB5, 0xB4, 0xB3 },
- { 0xCD, 0xB6, 0xB5, 0xB4, 0xB3 },
- { 0xA3, 0xB6, 0xB5, 0xB4, 0xB3 },
- { 0x0F, 0xB6, 0xB5, 0xB4, 0xB3 },
- { 0x05, 0xB6, 0xB5, 0xB4, 0xB3 } };
-
-// role variable is used to control whether this node is sending or receiving
-char role = 'R'; // integers 0-5 = TX node; character 'R' or integer 82 = RX node
-
-// For this example, we'll be using a payload containing
-// a node ID number and a single integer number that will be incremented
-// on every successful transmission.
-// Make a data structure to use as a payload.
-struct PayloadStruct {
- unsigned long nodeID;
- unsigned long payloadID;
-};
-PayloadStruct payload;
-
-// This example uses all 6 pipes to receive while TX nodes only use 2 pipes
-// To make this easier we'll use a function to manage the addresses, and the
-// payload's nodeID
-void setRole(); // declare a prototype; definition is found after the loop()
-
-void setup() {
-
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/MulticeiverDemo"));
- Serial.println(F("*** Enter a number between 0 and 5 (inclusive) to change"));
- Serial.println(F(" the identifying node number that transmits."));
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity of
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // save on transmission time by setting the radio to only transmit the
- // number of bytes we need to transmit a float
- radio.setPayloadSize(sizeof(payload)); // 2x int datatype occupy 8 bytes
-
- // Set the pipe addresses accordingly. This function additionally also
- // calls startListening() or stopListening() and sets the payload's nodeID
- setRole();
-
- // For debugging info
- // printf_begin(); // needed only once for printing details
- // radio.printDetails(); // (smaller) function that prints raw register values
- // radio.printPrettyDetails(); // (larger) function that prints human readable data
-
-} // setup()
-
-void loop() {
-
- if (role <= 53) {
- // This device is a TX node
-
- unsigned long start_timer = micros(); // start the timer
- bool report = radio.write(&payload, sizeof(payload)); // transmit & save the report
- unsigned long end_timer = micros(); // end the timer
-
- if (report) {
- // payload was delivered
-
- Serial.print(F("Transmission of payloadID "));
- Serial.print(payload.payloadID); // print payloadID
- Serial.print(F(" as node "));
- Serial.print(payload.nodeID); // print nodeID
- Serial.print(F(" successful!"));
- Serial.print(F(" Time to transmit: "));
- Serial.print(end_timer - start_timer); // print the timer result
- Serial.println(F(" us"));
- } else {
- Serial.println(F("Transmission failed or timed out")); // payload was not delivered
- }
- payload.payloadID++; // increment payload number
-
- // to make this example readable in the serial monitor
- delay(1000); // slow transmissions down by 1 second
-
- } else if (role == 'R') {
- // This device is the RX node
-
- uint8_t pipe;
- if (radio.available(&pipe)) { // is there a payload? get the pipe number that received it
- uint8_t bytes = radio.getPayloadSize(); // get the size of the payload
- radio.read(&payload, bytes); // fetch payload from FIFO
- Serial.print(F("Received "));
- Serial.print(bytes); // print the size of the payload
- Serial.print(F(" bytes on pipe "));
- Serial.print(pipe); // print the pipe number
- Serial.print(F(" from node "));
- Serial.print(payload.nodeID); // print the payload's origin
- Serial.print(F(". PayloadID: "));
- Serial.println(payload.payloadID); // print the payload's number
- }
- } // role
-
- if (Serial.available()) {
- // change the role via the serial monitor
-
- char c = Serial.read();
- if (toupper(c) == 'R' && role <= 53) {
- // Become the RX node
-
- role = 'R';
- Serial.println(F("*** CHANGING ROLE TO RECEIVER ***"));
- Serial.println(F("--- Enter a number between 0 and 5 (inclusive) to act as"));
- Serial.println(F(" a unique node number that transmits to the RX node."));
- setRole(); // change address on all pipes to TX nodes
-
- } else if (c >= 48 && c <= 53 && c != role) {
- // Become a TX node with identifier 'c'
-
- role = c - 48;
- Serial.print(F("*** CHANGING ROLE TO NODE "));
- Serial.print(c);
- Serial.println(F(" ***"));
- Serial.println(F("--- Enter a number between 0 and 5 (inclusive) to change"));
- Serial.println(F(" the identifying node number that transmits."));
- Serial.println(F("--- PRESS 'R' to act as the RX node."));
- setRole(); // change address on pipe 0 to the RX node
- }
- }
-
-} // loop
-
-void setRole() {
- if (role == 'R') {
- // For the RX node
-
- // Set the addresses for all pipes to TX nodes
- for (uint8_t i = 0; i < 6; ++i)
- radio.openReadingPipe(i, address[i]);
-
- radio.startListening(); // put radio in RX mode
-
- } else {
- // For the TX node
-
- // set the payload's nodeID & reset the payload's identifying number
- payload.nodeID = role;
- payload.payloadID = 0;
-
- // set the TX address of the RX node for use on the TX pipe (pipe 0)
- radio.stopListening(address[role]); // put radio in TX mode
-
- // According to the datasheet, the auto-retry features's delay value should
- // be "skewed" to allow the RX node to receive 1 transmission at a time.
- // So, use varying delay between retry attempts and 15 (at most) retry attempts
- radio.setRetries(((role * 3) % 12) + 3, 15); // maximum value is 15 for both args
- }
-} // setRole
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/StreamingData/StreamingData.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/StreamingData/StreamingData.ino
deleted file mode 100644
index e4a4bc6..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/StreamingData/StreamingData.ino
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * Author: Brendan Doherty 2bndy5
- */
-
-/**
- * A simple example of streaming data from 1 nRF24L01 transceiver to another.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- * Use the Serial Monitor to change each node's behavior.
- */
-#include <SPI.h>
-#include "printf.h"
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// Let these addresses be used for the pair
-uint8_t address[][6] = { "1Node", "2Node" };
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-
-// to use different addresses on a pair of radios, we need a variable to
-// uniquely identify which address this radio will use to transmit
-bool radioNumber; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
-
-// Used to control whether this node is sending or receiving
-bool role = false; // true = TX node, false = RX node
-
-// For this example, we'll be sending 32 payloads each containing
-// 32 bytes of data that looks like ASCII art when printed to the serial
-// monitor. The TX node and RX node needs only a single 32 byte buffer.
-#define SIZE 32 // this is the maximum for this example. (minimum is 1)
-char buffer[SIZE + 1]; // for the RX node
-uint8_t counter = 0; // for counting the number of received payloads
-void makePayload(uint8_t); // prototype to construct a payload dynamically
-
-
-void setup() {
-
- buffer[SIZE] = 0; // add a NULL terminating character (for easy printing)
-
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/StreamingData"));
-
- // To set the radioNumber via the Serial monitor on startup
- Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'"));
- while (!Serial.available()) {
- // wait for user input
- }
- char input = Serial.parseInt();
- radioNumber = input == 1;
- Serial.print(F("radioNumber = "));
- Serial.println((int)radioNumber);
-
- // role variable is hardcoded to RX behavior, inform the user of this
- Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity to
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // save on transmission time by setting the radio to only transmit the
- // number of bytes we need to transmit
- radio.setPayloadSize(SIZE); // default value is the maximum 32 bytes
-
- // set the TX address of the RX node for use on the TX pipe (pipe 0)
- radio.stopListening(address[radioNumber]); // put radio in TX mode
-
- // set the RX address of the TX node into a RX pipe
- radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
-
- // additional setup specific to the node's RX role
- if (!role) {
- radio.startListening(); // put radio in RX mode
- }
-
- // For debugging info
- // printf_begin(); // needed only once for printing details
- // radio.printDetails(); // (smaller) function that prints raw register values
- // radio.printPrettyDetails(); // (larger) function that prints human readable data
-
-} // setup()
-
-
-void loop() {
-
- if (role) {
- // This device is a TX node
-
- radio.flush_tx();
- uint8_t i = 0;
- uint8_t failures = 0;
- unsigned long start_timer = micros(); // start the timer
- while (i < SIZE) {
- makePayload(i); // make the payload
- if (!radio.writeFast(&buffer, SIZE)) {
- uint8_t flags = radio.getStatusFlags();
- if (flags & RF24_TX_DF) {
- failures++;
- // now we need to reset the tx_df flag and the radio's CE pin
- radio.ce(LOW);
- radio.clearStatusFlags(RF24_TX_DF);
- radio.ce(HIGH);
- }
- // else the TX FIFO is full; just continue loop.
- } else {
- i++;
- }
-
- if (failures >= 100) {
- Serial.print(F("Too many failures detected. Aborting at payload "));
- Serial.println(buffer[0]);
- break;
- }
- }
- unsigned long end_timer = micros(); // end the timer
-
- Serial.print(F("Time to transmit = "));
- Serial.print(end_timer - start_timer); // print the timer result
- Serial.print(F(" us with "));
- Serial.print(failures); // print failures detected
- Serial.println(F(" failures detected"));
-
- // to make this example readable in the serial monitor
- delay(1000); // slow transmissions down by 1 second
-
- } else {
- // This device is a RX node
-
- if (radio.available()) { // is there a payload?
- radio.read(&buffer, SIZE); // fetch payload from FIFO
- Serial.print(F("Received: "));
- Serial.print(buffer); // print the payload's value
- Serial.print(F(" - "));
- Serial.println(counter++); // print the received counter
- }
- } // role
-
- if (Serial.available()) {
- // change the role via the serial monitor
-
- char c = toupper(Serial.read());
- if (c == 'T' && !role) {
- // Become the TX node
-
- role = true;
- counter = 0; //reset the RX node's counter
- Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
- radio.stopListening();
-
- } else if (c == 'R' && role) {
- // Become the RX node
-
- role = false;
- Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
- radio.startListening();
- }
- }
-
-} // loop
-
-
-void makePayload(uint8_t i) {
- // Make a single payload based on position in stream.
- // This example employs function to save memory on certain boards.
-
- // let the first character be an identifying alphanumeric prefix
- // this lets us see which payload didn't get received
- buffer[0] = i + (i < 26 ? 65 : 71);
- for (uint8_t j = 0; j < SIZE - 1; ++j) {
- char chr = j >= (SIZE - 1) / 2 + abs((SIZE - 1) / 2 - i);
- chr |= j < (SIZE - 1) / 2 - abs((SIZE - 1) / 2 - i);
- buffer[j + 1] = chr + 48;
- }
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/encodeRadioDetails.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/encodeRadioDetails.ino
deleted file mode 100644
index 6aee593..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/encodeRadioDetails.ino
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- See documentation at https://nRF24.github.io/RF24
- See License information at root directory of this library
- Authors: Brendan Doherty (2bndy5), Douglas Quigg (dstroy0)
-*/
-
-/**
- A simple example of getting debug info from the nRF24L01 transceiver.
-
- This example was written to demonstrate alternative methods to get debugging data.
- 1. radio.encodeRadioDetails() will provide a data dump of all the nRF24L01's registers.
- 2. radio.sprintfPrettyDetails() will behave similarly to printPrettyDetails(), but it
- outputs to a char buffer that can be printed to any Serial (or other output) stream.
-
- Additionally, this example will show all default configuration values.
-*/
-#include <SPI.h>
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-/*
- For this example, we'll be using a data buffer containing
- radio details encoded with RF24::encodeRadioDetails().
- It is meant to be decoded by an external program.
-
- There is a python script located in this example's folder that
- will take a space-delimited string of hexadecimal characters and
- decode then print it out as human readable information.
-*/
-uint8_t encoded_details[43] = { 0 };
-
-// Use this function to print out the encoded_details as a
-// space-delimited string of hexadecimal characters.
-void dumpRegData() {
- for (uint8_t i = 0; i < 43; ++i) {
- Serial.print(encoded_details[i], HEX);
- if (i < 42)
- Serial.print(F(" "));
- }
-}
-
-void setup() {
-
- Serial.begin(115200);
- while (!Serial) {
- // some boards need to wait to ensure access to serial over USB
- }
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Serial.println(F("radio hardware is not responding!!"));
- while (1) {} // hold in infinite loop
- }
-
- // print example's introductory prompt
- Serial.println(F("RF24/examples/encodedRadioDetails"));
-
- Serial.println(F("Press any key to show debugging information"));
- while (!Serial.available()) {
- // wait for user input
- }
-
- // For debugging info
- char *debug_info = new char[870];
- uint16_t str_len = radio.sprintfPrettyDetails(debug_info);
- Serial.println(debug_info);
- Serial.print(F("\nThe above output used "));
- Serial.print(str_len);
- Serial.println(F(" characters."));
-
- // encoded_details is NOT human readable.
- // encodeRadioDetails() is very small when used on its own because it puts debugging information into a byte array
- // No printf() support needed because it doesn't use an output stream.
- radio.encodeRadioDetails(encoded_details);
- Serial.println(F("\nhexadecimal dump of all registers:"));
- dumpRegData();
-
- Serial.println(F("\n\nCopy the above string of hexadecimal characters (including spaces)."));
- Serial.print(F("Then paste it into a terminal using the print_details.py located in"));
- Serial.print(F(" this example's folder. Like so:\npython print_details.py \""));
- dumpRegData();
- Serial.println(F("\"\n***You may need to use 'python3' (without quotes) on Linux"));
-} // setup
-
-/* Registers corresponding to index of encoded_details array
- 0: NRF_CONFIG
- 1: EN_AA
- 2: EN_RXADDR
- 3: SETUP_AW
- 4: SETUP_RETR
- 5: RF_CH
- 6: RF_SETUP
- 7: NRF_STATUS
- 8: OBSERVE_TX
- 9: CD (aka RPD)
- 10-14: RX_ADDR_P0
- 15-19: RX_ADDR_P1
- 20: RX_ADDR_P2
- 21: RX_ADDR_P3
- 22: RX_ADDR_P4
- 23: RX_ADDR_P5
- 24-28: TX_ADDR
- 29: RX_PW_P0
- 30: RX_PW_P1
- 31: RX_PW_P2
- 32: RX_PW_P3
- 33: RX_PW_P4
- 34: RX_PW_P5
- 35: FIFO_STATUS
- 36: DYNPD
- 37: FEATURE
- 38-39: ce_pin
- 40-41: csn_pin
- 42: SPI speed MHz | (isPlusVariant << 4)
-*/
-
-void loop() {
- // Nothing to do here. We did it all at the end of setup()
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/print_details.py b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/print_details.py
deleted file mode 100644
index 2d09e2c..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/encodeRadioDetails/print_details.py
+++ /dev/null
@@ -1,196 +0,0 @@
-"""A simple script to take all data dumped from the nRF24L01 registers and
-output it in human readable form.
-
-Example usage:
- print_details.py "0e 3f 02 03 00 02 00 0e"
-
-Notes:
- * The radio's power state is represented under the assumption that
- the radio's CE pin is inactive low.
-"""
-# pylint: disable=consider-using-f-string
-import struct
-import argparse
-
-
-def hex_str_to_bytes(s_in: str) -> bytes:
- """Used to convert a string from CLI to a bytearray object.
-
- .. warning:: This function assumes that the string consists of only
- hexadecimal characters.
- """
- return bytes([int(i, 16) for i in s_in.split()])
-
-
-argparser = argparse.ArgumentParser(
- description=__doc__,
- formatter_class=argparse.RawDescriptionHelpFormatter,
-)
-argparser.add_argument(
- "buffer",
- type=hex_str_to_bytes,
- help="The encoded buffer from the Arduino Serial Monitor. The string passed is "
- "expected to contain only hexadecimal digits. It should be 38 words long "
- "(separated by spaces).",
-)
-
-
-def address_repr(buf, reverse: bool = True, delimit: str = "") -> str:
- """Convert a buffer into a hexadecimal string."""
- order = range(len(buf) - 1, -1, -1) if reverse else range(len(buf))
- return delimit.join(["%02X" % buf[byte] for byte in order])
-
-
-# pylint: disable=too-many-locals,too-many-statements
-def print_details(encoded_buf: bytearray):
- """This debugging function outputs all details about the nRF24L01."""
- # declare sequences
- pipes = [bytearray(5)] * 2 + [0] * 4
- pl_len = [0] * 6
-
- # unpack bytearray
- (
- config, # 0x00
- auto_ack, # 0x01
- open_pipes, # 0x02
- addr_len, # 0x03
- retry_setup, # 0x04
- channel, # 0x05
- rf_setup, # 0x06
- status, # 0x07
- observer, # 0x08
- rpd, # 0x09
- ) = struct.unpack("10B", encoded_buf[:10])
- pipes[0] = encoded_buf[10:15] # 0x0A
- pipes[1] = encoded_buf[15:20] # 0x0B
- (
- pipes[2], # 0x0C
- pipes[3], # 0x0D
- pipes[4], # 0x0E
- pipes[5], # 0x0F
- ) = struct.unpack("4B", encoded_buf[20:24])
- tx_address = encoded_buf[24:29] # 0x10
- (
- pl_len[0], # 0x11
- pl_len[1], # 0x12
- pl_len[2], # 0x13
- pl_len[3], # 0x14
- pl_len[4], # 0x15
- pl_len[5], # 0x16
- fifo, # 0x17
- dyn_pl, # 0x1C
- features, # 0x1D
- ) = struct.unpack("9B", encoded_buf[29:38])
- ce_pin, csn_pin, spi_speed = struct.unpack(">2H1B", encoded_buf[38:44])
-
- # do some deciphering arithmetic
- addr_len += 2
- crc = (2 if config & 4 else 1) if auto_ack else max(0, ((config & 0x0C) >> 2) - 1)
- d_rate = rf_setup & 0x28
- d_rate = (2 if d_rate == 8 else 250) if d_rate else 1
- pa_level = (3 - ((rf_setup & 6) >> 1)) * -6
- pa_level = (
- "MIN"
- if pa_level == -18
- else ("LOW" if pa_level == -12 else ("HIGH" if pa_level == -6 else "MAX"))
- )
- dyn_p = (
- ("_Enabled" if dyn_pl else "Disabled")
- if dyn_pl == 0x3F or not dyn_pl
- else "0b" + "0" * (8 - len(bin(dyn_pl))) + bin(dyn_pl)[2:]
- )
- auto_ack = (
- ("Enabled" if auto_ack else "Disabled")
- if auto_ack == 0x3F or not auto_ack
- else "0b" + "0" * (8 - len(bin(auto_ack))) + bin(auto_ack)[2:]
- )
- pwr = "Standby" if config & 2 else "Off"
- is_plus_variant = bool(spi_speed >> 4)
- spi_speed = spi_speed & 0xF
-
- # print it all out
- print("CE pin____________________{}".format(ce_pin))
- print("CSN pin___________________{}".format(csn_pin))
- print("SPI speed_________________{} MHz".format(spi_speed))
- print("Is a plus variant_________{}".format(is_plus_variant))
- print(
- "Channel___________________{}".format(channel),
- "~ {} GHz".format((channel + 2400) / 1000),
- )
- print(
- "RF Data Rate______________{}".format(d_rate),
- "Mbps" if d_rate != 250 else "Kbps",
- )
- print("RF Power Amplifier________PA_{}".format(pa_level))
- print(
- "RF Low Noise Amplifier____{}abled".format(
- "En" if bool(rf_setup & 1) else "Dis"
- )
- )
- print("CRC Length________________{} bits".format(crc * 8))
- print("Address length____________{} bytes".format(addr_len))
- print("TX Payload lengths________{} bytes".format(pl_len[0]))
- print(
- "Auto retry delay__________{} microseconds".format(
- ((retry_setup & 0xF0) >> 4) * 250 + 250
- )
- )
- print("Auto retry attempts_______{} maximum".format(retry_setup & 0x0F))
- print("Re-use TX FIFO____________{}".format(bool(fifo & 64)))
- print("Received Power Detected___{}".format(bool(rpd)))
- print(
- "Packets lost on current channel_____________________{}".format(observer >> 4)
- )
- print(
- "Retry attempts made for last transmission___________{}".format(observer & 0xF)
- )
- print(
- "IRQ on Data Ready__{}abled".format("Dis" if config & 64 else "_En"),
- " Data Ready___________{}".format(bool(status & 0x40)),
- )
- print(
- "IRQ on Data Sent___{}abled".format("Dis" if config & 32 else "_En"),
- " Data Sent____________{}".format(bool(status & 0x20)),
- )
- print(
- "IRQ on Data Fail___{}abled".format("Dis" if config & 16 else "_En"),
- " Data Failed__________{}".format(bool(status & 0x10)),
- )
- print(
- "TX FIFO full__________{}e".format("_Tru" if fifo & 0x20 else "Fals"),
- " TX FIFO empty________{}".format(bool(fifo & 0x10)),
- )
- print(
- "RX FIFO full__________{}e".format("_Tru" if fifo & 2 else "Fals"),
- " RX FIFO empty________{}".format(bool(fifo & 1)),
- )
- print(
- "Multicast__________{}ed Custom ACK Payload___{}abled".format(
- "_Allow" if features & 1 else "Disabl",
- "En" if features & 2 else "Dis",
- ),
- )
- print("Dynamic Payloads___{} Auto Acknowledgment__{}".format(dyn_p, auto_ack))
- print(
- "Primary Mode_____________{}X".format("R" if config & 1 else "T"),
- " Power Mode___________{}".format(pwr),
- )
- print("TX address____________ 0x{}".format(address_repr(tx_address)))
- for i in range(6):
- is_open = open_pipes & (1 << i)
- address = pipes[i] if i < 2 else bytes([pipes[i]]) + pipes[1][1:]
- print(
- "Pipe {} ({}) bound: 0x{}".format(
- i, " open " if is_open else "closed", address_repr(address)
- ),
- )
- if is_open and not dyn_pl & (1 << i):
- print("\t\texpecting {} byte static payloads".format(pl_len[i]))
-
-
-# pylint: enable=too-many-locals,too-many-statements
-
-
-if __name__ == "__main__":
- args = argparser.parse_args()
- print_details(args.buffer)
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/GettingStarted_HandlingFailures/GettingStarted_HandlingFailures.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/GettingStarted_HandlingFailures/GettingStarted_HandlingFailures.ino
deleted file mode 100644
index 1b6695f..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/GettingStarted_HandlingFailures/GettingStarted_HandlingFailures.ino
+++ /dev/null
@@ -1,217 +0,0 @@
-
-/*
- Getting Started example sketch for nRF24L01+ radios
- This is a very basic example of how to send data from one node to another
- but modified to include failure handling.
-
- The nrf24l01+ radios are fairly reliable devices, but on breadboards etc, with inconsistent wiring, failures may
- occur randomly after many hours to days or weeks. This sketch demonstrates how to handle the various failures and
- keep the radio operational.
-
- The three main failure modes of the radio include:
- Writing to radio: Radio unresponsive - Fixed internally by adding a timeout to the internal write functions in RF24 (failure handling)
- Reading from radio: Available returns true always - Fixed by adding a timeout to available functions by the user. This is implemented internally in RF24Network.
- Radio configuration settings are lost - Fixed by monitoring a value that is different from the default, and re-configuring the radio if this setting reverts to the default.
-
- The printDetails output should appear as follows for radio #0:
-
- STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
- RX_ADDR_P0-1 = 0x65646f4e31 0x65646f4e32
- RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
- TX_ADDR = 0x65646f4e31
- RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
- EN_AA = 0x3f
- EN_RXADDR = 0x02
- RF_CH = 0x4c
- RF_SETUP = 0x03
- CONFIG = 0x0f
- DYNPD/FEATURE = 0x00 0x00
- Data Rate = 1MBPS
- Model = nRF24L01+
- CRC Length = 16 bits
- PA Power = PA_LOW
-
- Users can use this sketch to troubleshoot radio module wiring etc. as it makes the radios hot-swappable
-
- Updated: 2019 by TMRh20
-*/
-
-#include <SPI.h>
-#include "RF24.h"
-#include "printf.h"
-
-/****************** User Config ***************************/
-/*** Set this radio as radio number 0 or 1 ***/
-bool radioNumber = 0;
-
-/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
-RF24 radio(7, 8);
-/**********************************************************/
-
-byte addresses[][6] = { "1Node", "2Node" };
-
-// Used to control whether this node is sending or receiving
-bool role = 0;
-
-
-/**********************************************************/
-//Function to configure the radio
-void configureRadio() {
-
- radio.begin();
-
- // Set the PA Level low to prevent power supply related issues since this is a
- // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
- radio.setPALevel(RF24_PA_LOW);
-
- // Open a writing and reading pipe on each radio, with opposite addresses
- if (radioNumber) {
- radio.openWritingPipe(addresses[1]);
- radio.openReadingPipe(1, addresses[0]);
- } else {
- radio.openWritingPipe(addresses[0]);
- radio.openReadingPipe(1, addresses[1]);
- }
-
- // Start the radio listening for data
- radio.startListening();
- radio.printDetails();
-}
-
-
-/**********************************************************/
-
-void setup() {
- Serial.begin(115200);
- Serial.println(F("RF24/examples/GettingStarted"));
- Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
-
- printf_begin();
-
- configureRadio();
-}
-
-uint32_t configTimer = millis();
-
-void loop() {
-
- if (radio.failureDetected) {
- radio.failureDetected = false;
- delay(250);
- Serial.println("Radio failure detected, restarting radio");
- configureRadio();
- }
- // Every 5 seconds, verify the configuration of the radio. This can be
- // done using any setting that is different from the radio defaults.
- if (millis() - configTimer > 5000) {
- configTimer = millis();
- if (radio.getDataRate() != RF24_1MBPS) {
- radio.failureDetected = true;
- Serial.print("Radio configuration error detected");
- }
- }
-
-
- /****************** Ping Out Role ***************************/
-
- if (role == 1) {
-
- radio.stopListening(); // First, stop listening so we can talk.
-
- Serial.println(F("Now sending"));
-
- unsigned long start_time = micros(); // Take the time, and send it. This will block until complete
- if (!radio.write(&start_time, sizeof(unsigned long))) {
- Serial.println(F("failed"));
- }
-
- radio.startListening(); // Now, continue listening
-
- unsigned long started_waiting_at = micros(); // Set up a timeout period, get the current microseconds
- bool timeout = false; // Set up a variable to indicate if a response was received or not
-
- while (!radio.available()) // While nothing is received
- {
- if (micros() - started_waiting_at > 200000) // If waited longer than 200ms, indicate timeout and exit while loop
- {
- timeout = true;
- break;
- }
- }
-
- if (timeout) {
- // Describe the results
- Serial.println(F("Failed, response timed out."));
- } else {
- // Grab the response, compare, and send to debugging spew
-
- unsigned long got_time; // Variable for the received timestamp
-
- // Failure Handling
- uint32_t failTimer = millis();
- while (radio.available()) // If available() always returns true, there is a problem
- {
- if (millis() - failTimer > 250) {
- radio.failureDetected = true;
- Serial.println("Radio available failure detected");
- break;
- }
- radio.read(&got_time, sizeof(unsigned long));
- }
- unsigned long end_time = micros();
-
- // Spew it
- Serial.print(F("Sent "));
- Serial.print(start_time);
- Serial.print(F(", Got response "));
- Serial.print(got_time);
- Serial.print(F(", Round-trip delay "));
- Serial.print(end_time - start_time);
- Serial.println(F(" microseconds"));
- }
-
- delay(1000); // Try again 1s later
- }
-
-
- /****************** Pong Back Role ***************************/
-
- if (role == 0) {
- unsigned long got_time; // Variable for the received timestamp
-
- if (radio.available()) {
- uint32_t failTimer = millis();
-
- while (radio.available()) // While there is data ready
- {
- if (millis() - failTimer > 500) {
- Serial.println("Radio available failure detected");
- radio.failureDetected = true;
- break;
- }
- radio.read(&got_time, sizeof(unsigned long)); // Get the payload
- }
-
- radio.stopListening(); // First, stop listening so we can talk
- radio.write(&got_time, sizeof(unsigned long)); // Send the final one back.
- radio.startListening(); // Now, resume listening so we catch the next packets.
- Serial.print(F("Sent response "));
- Serial.println(got_time);
- }
- }
-
-
- /****************** Change Roles via Serial Commands ***************************/
-
- if (Serial.available()) {
- char c = toupper(Serial.read());
- if (c == 'T' && role == 0) {
- Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
- role = 1; // Become the primary transmitter (ping out)
- } else if (c == 'R' && role == 1) {
- Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
- role = 0; // Become the primary receiver (pong back)
- radio.startListening();
- }
- }
-} // Loop
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/TransferTimeouts/TransferTimeouts.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/TransferTimeouts/TransferTimeouts.ino
deleted file mode 100644
index 2b831a8..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/TransferTimeouts/TransferTimeouts.ino
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- TMRh20 2014
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-*/
-
-/**
- Reliably transmitting large volumes of data with a low signal or in noisy environments
- This example demonstrates data transfer functionality with the use of auto-retry
- and auto-reUse functionality enabled. This sketch demonstrates how a user can extend
- the auto-retry functionality to any chosen time period, preventing data loss and ensuring
- the consistency of data.
-
- This sketch demonstrates use of the writeBlocking() functionality, and extends the standard
- retry functionality of the radio. Payloads will be auto-retried until successful or the
- extended timeout period is reached.
-*/
-
-
-
-#include <SPI.h>
-#include "nRF24L01.h"
-#include "RF24.h"
-#include "printf.h"
-
-/************* USER Configuration *****************************/
-
-RF24 radio(7, 8); // Set up nRF24L01 radio on SPI bus plus pins 7 & 8
-unsigned long timeoutPeriod = 3000; // Set a user-defined timeout period. With auto-retransmit set to (15,15) retransmission will take up to 60ms and as little as 7.5ms with it set to (1,15).
-// With a timeout period of 1000, the radio will retry each payload for up to 1 second before giving up on the transmission and starting over
-
-/***************************************************************/
-
-const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL }; // Radio pipe addresses for the 2 nodes to communicate.
-
-byte data[32]; //Data buffer
-
-volatile unsigned long counter;
-unsigned long rxTimer, startTime, stopTime, payloads = 0;
-bool tx = 1, rx = 0, role = 0, transferInProgress = 0;
-
-
-void setup(void) {
-
- Serial.begin(115200);
- printf_begin();
-
- radio.begin(); // Setup and configure rf radio
- radio.setChannel(1); // Set the channel
- radio.setPALevel(RF24_PA_LOW); // Set PA LOW for this demonstration. We want the radio to be as lossy as possible for this example.
- radio.setDataRate(RF24_1MBPS); // Raise the data rate to reduce transmission distance and increase lossiness
- radio.setAutoAck(1); // Ensure autoACK is enabled
- radio.setRetries(2, 15); // Optionally, increase the delay between retries. Want the number of auto-retries as high as possible (15)
- radio.setCRCLength(RF24_CRC_16); // Set CRC length to 16-bit to ensure quality of data
- radio.openWritingPipe(pipes[0]); // Open the default reading and writing pipe
- radio.openReadingPipe(1, pipes[1]);
-
- radio.startListening(); // Start listening
- radio.printDetails(); // Dump the configuration of the rf unit for debugging
-
- printf("\n\rRF24/examples/Transfer Rates/\n\r");
- printf("*** PRESS 'T' to begin transmitting to the other node\n\r");
-
- randomSeed(analogRead(0)); //Seed for random number generation
- for (int i = 0; i < 32; i++) {
- data[i] = random(255); //Load the buffer with random data
- }
- radio.powerUp(); //Power up the radio
-}
-
-
-
-void loop(void) {
-
-
- if (role == tx) {
- delay(2000); // Pause for a couple seconds between transfers
- printf("Initiating Extended Timeout Data Transfer\n\r");
-
- unsigned long cycles = 1000; // Change this to a higher or lower number. This is the number of payloads that will be sent.
-
- unsigned long transferCMD[] = { 'H', 'S', cycles }; // Indicate to the other radio that we are starting, and provide the number of payloads that will be sent
- radio.writeFast(&transferCMD, 12); // Send the transfer command
- if (radio.txStandBy(timeoutPeriod)) { // If transfer initiation was successful, do the following
-
- startTime = millis(); // For calculating transfer rate
- boolean timedOut = 0; // Boolean for keeping track of failures
-
- for (unsigned long i = 0; i < cycles; i++) // Loop through a number of cycles
- {
- data[0] = i; // Change the first byte of the payload for identification
-
- if (!radio.writeBlocking(&data, 32, timeoutPeriod)) { // If retries are failing and the user defined timeout is exceeded
- timedOut = 1; // Indicate failure
- counter = cycles; // Set the fail count to maximum
- break; // Break out of the for loop
- }
- }
-
-
- stopTime = millis(); // Capture the time of completion or failure
-
- //This should be called to wait for completion and put the radio in standby mode after transmission, returns 0 if data still in FIFO (timed out), 1 if success
- if (timedOut) {
- radio.txStandBy(); //Partially blocking standby, blocks until success or max retries. FIFO flushed if auto timeout reached
- } else {
- radio.txStandBy(timeoutPeriod); //Standby, block until FIFO empty (sent) or user specified timeout reached. FIFO flushed if user timeout reached.
- }
-
- } else {
- Serial.println("Communication not established"); //If unsuccessful initiating transfer, exit and retry later
- }
-
- float rate = cycles * 32 / (stopTime - startTime); //Display results:
-
- Serial.print("Transfer complete at ");
- Serial.print(rate);
- Serial.println(" KB/s");
- Serial.print(counter);
- Serial.print(" of ");
- Serial.print(cycles);
- Serial.println(" Packets Failed to Send");
- counter = 0;
- }
-
-
-
- if (role == rx) {
-
- if (!transferInProgress) { // If a bulk data transfer has not been started
- if (radio.available()) {
- radio.read(&data, 32); //Read any available payloads for analysis
-
- if (data[0] == 'H' && data[4] == 'S') { // If a bulk data transfer command has been received
- payloads = data[8]; // Read the first two bytes of the unsigned long. Need to read the 3rd and 4th if sending more than 65535 payloads
- payloads |= data[9] << 8; // This is the number of payloads that will be sent
- counter = 0; // Reset the payload counter to 0
- transferInProgress = 1; // Indicate it has started
- startTime = rxTimer = millis(); // Capture the start time to measure transfer rate and calculate timeouts
- }
- }
- } else {
- if (radio.available()) { // If in bulk transfer mode, and a payload is available
- radio.read(&data, 32); // Read the payload
- rxTimer = millis(); // Reset the timeout timer
- counter++; // Keep a count of received payloads
- } else if (millis() - rxTimer > timeoutPeriod) { // If no data available, check the timeout period
- Serial.println("Transfer Failed"); // If per-payload timeout exceeded, end the transfer
- transferInProgress = 0;
- } else if (counter >= payloads) { // If the specified number of payloads is reached, transfer is completed
- startTime = millis() - startTime; // Calculate the total time spent during transfer
- float numBytes = counter * 32; // Calculate the number of bytes transferred
- Serial.print("Rate: "); // Print the transfer rate and number of payloads
- Serial.print(numBytes / startTime);
- Serial.println(" KB/s");
- Serial.print("Payload Count: ");
- Serial.println(counter);
- transferInProgress = 0; // End the transfer as complete
- }
- }
- }
-
- //
- // Change roles
- //
-
- if (Serial.available()) {
- char c = toupper(Serial.read());
- if (c == 'T' && role == rx) {
- printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r");
- radio.openWritingPipe(pipes[1]);
- radio.openReadingPipe(1, pipes[0]);
- radio.stopListening();
- role = tx; // Become the primary transmitter (ping out)
- } else if (c == 'R' && role == tx) {
- radio.openWritingPipe(pipes[0]);
- radio.openReadingPipe(1, pipes[1]);
- radio.startListening();
- printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r");
- role = rx; // Become the primary receiver (pong back)
- }
- }
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_dyn/pingpair_dyn.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_dyn/pingpair_dyn.ino
deleted file mode 100644
index 8df9524..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_dyn/pingpair_dyn.ino
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- */
-
-/**
- * Example using Dynamic Payloads
- *
- * This is an example of how to use payloads of a varying (dynamic) size.
- */
-
-#include <SPI.h>
-#include "nRF24L01.h"
-#include "RF24.h"
-#include "printf.h"
-
-// Hardware configuration
-RF24 radio(7, 8); // Set up nRF24L01 radio on SPI bus plus pins 7 & 8
-
-// Radio pipe addresses for the 2 nodes to communicate.
-const uint64_t addresses[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
-
-/************************* Role management ****************************/
-// Set up role. This sketch uses the same software for all the nodes in this
-// system. Doing so greatly simplifies testing.
-
-// The role_pin is a digital input pin used to set the role of this radio.
-// Connect the role_pin to GND to be the 'pong' receiver
-// Leave the role_pin open to be the 'ping' transmitter
-const short role_pin = 5; // use pin 5
-typedef enum { role_ping_out = 1,
- role_pong_back } role_e; // The various roles supported by this sketch
-const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back" }; // The debug-friendly names of those roles
-role_e role; // The role of the current running sketch
-
-
-// variables used for changing the payload size dynamically (used when role == role_ping_out)
-const int min_payload_size = 4;
-const int max_payload_size = 32;
-const int payload_size_increment = 1;
-int send_payload_size = min_payload_size;
-
-char receive_payload[max_payload_size + 1]; // +1 to allow room for a terminating NULL char
-
-void setup(void) {
- pinMode(role_pin, INPUT); // set up the role pin
- digitalWrite(role_pin, HIGH);
- delay(20); // Just to get a solid reading on the role pin
-
- // read the role_pin, establish our role
- if (digitalRead(role_pin)) {
- role = role_ping_out;
- } else {
- role = role_pong_back;
- }
-
- Serial.begin(115200);
- printf_begin(); // needed for printDetails()
-
- // Print preamble
- Serial.println(F("RF24/examples/pingpair_dyn/"));
- Serial.print(F("ROLE: "));
- Serial.println(role_friendly_name[role]);
-
- // Setup and configure rf radio
- radio.begin();
- radio.enableDynamicPayloads(); // Enable dynamic payloads
- radio.setRetries(5, 15); // delay between retries = 5 * 250 + 250 = 1500 microseconds, number of retries = 15
-
- // Open a writing and reading pipe on each radio, with opposite addresses
- if (role == role_ping_out) {
- radio.openWritingPipe(addresses[0]);
- radio.openReadingPipe(1, addresses[1]);
- } else {
- radio.openWritingPipe(addresses[1]);
- radio.openReadingPipe(1, addresses[0]);
- }
-
- radio.startListening(); // Start listening
- radio.printDetails(); // Dump the configuration of the rf unit for debugging
-}
-
-void loop() {
-
-
- /****************** Ping Out Role ***************************/
-
- if (role == role_ping_out) {
- // The payload will always be the same, what will change is how much of it we send.
- static char send_payload[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ789012";
-
- radio.stopListening(); // First, stop listening so we can talk.
-
- // Send the payload
- Serial.print(F("Now sending length "));
- Serial.println(send_payload_size);
- radio.write(send_payload, send_payload_size); // This will block until complete
-
- radio.startListening(); // Now, continue listening
-
- unsigned long started_waiting_at = millis(); // Start a timer for measuring timeout
- bool timeout = false;
- while (!radio.available() && !timeout) // Wait until we get a response or timeout is reached
- {
- if (millis() - started_waiting_at > 500) // Only wait for 500 milliseconds
- timeout = true;
- }
-
- // Describe the results
- if (timeout) {
- Serial.println(F("Failed, response timed out."));
- } else {
- // Grab the response and print it
-
- uint8_t len = radio.getDynamicPayloadSize(); // get payload's length
-
- // If an illegal payload size was detected, all RX payloads will be flushed
- if (!len)
- return;
-
- radio.read(receive_payload, len);
-
- // Use payload as a C-string (for easy printing)
- receive_payload[len] = 0; // put a NULL terminating zero at the end
-
- // Spew it
- Serial.print(F("Got response size="));
- Serial.print(len);
- Serial.print(F(" value="));
- Serial.println(receive_payload);
- }
-
- send_payload_size += payload_size_increment; // Update size for next time.
- if (send_payload_size > max_payload_size) // if payload length is larger than the radio can handle
- send_payload_size = min_payload_size; // reset the payload length
-
- delay(1000); // Try again 1s later
- }
-
-
- /****************** Pong Back Role ***************************/
- // Receive each packet, send it back, and dump it out
-
- if (role == role_pong_back) {
- while (radio.available()) // if there is data ready
- {
-
- uint8_t len = radio.getDynamicPayloadSize(); // Fetch the the payload size
-
- // If an illegal payload size was detected, all RX payloads will be flushed
- if (!len)
- continue;
-
- radio.read(receive_payload, len);
-
- // Use payload as a C-string (for easy printing)
- receive_payload[len] = 0; // put a NULL terminating zero at the end
-
- // Spew it
- Serial.print(F("Got response size="));
- Serial.print(len);
- Serial.print(F(" value="));
- Serial.println(receive_payload);
-
- radio.stopListening(); // First, stop listening so we can talk
-
- // Send a reply that the packet was received
- //
- // You will have better luck delivering your message if
- // you wait for the other node to start listening first
- delay(20);
- radio.write(receive_payload, len);
- Serial.println(F("Sent response."));
-
- radio.startListening(); // Now, resume listening so we catch the next packets.
- }
- }
-} // loop
-// vim:cin:ai:sts=2 sw=2 ft=cpp
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_irq/pingpair_irq.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_irq/pingpair_irq.ino
deleted file mode 100644
index 19623cc..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_irq/pingpair_irq.ino
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-
- Update 2014 - TMRh20
-*/
-
-/**
- Example of using interrupts
-
- This is an example of how to user interrupts to interact with the radio, and a demonstration
- of how to use them to sleep when receiving, and not miss any payloads.
- The pingpair_sleepy example expands on sleep functionality with a timed sleep option for the transmitter.
- Sleep functionality is built directly into my fork of the RF24Network library
-*/
-
-#include <SPI.h>
-#include "nRF24L01.h"
-#include "RF24.h"
-#include "printf.h"
-
-// Hardware configuration
-RF24 radio(7, 8); // Set up nRF24L01 radio on SPI bus plus pins 7 & 8
-
-// Our ACK payload will simply be 4 bytes containing the number of payloads received
-static uint32_t message_count = 1; // start counting at 1
-
-// Demonstrates another method of setting up the addresses
-byte address[][5] = { 0xCC, 0xCE, 0xCC, 0xCE, 0xCC, 0xCE, 0xCC, 0xCE, 0xCC, 0xCE };
-
-/************************* Role management ****************************/
-// Set up role. This sketch uses the same software for all the nodes in this
-// system. Doing so greatly simplifies testing.
-
-// The role_pin is a digital input pin used to set the role of this radio.
-// Connect the role_pin to GND to be the 'pong' receiver
-// Leave the role_pin open to be the 'ping' transmitter
-const short role_pin = 5; // use pin 5
-typedef enum { role_sender = 1,
- role_receiver } role_e; // The various roles supported by this sketch
-const char* role_friendly_name[] = { "invalid", "Sender", "Receiver" }; // The debug-friendly names of those roles
-role_e role; // The role of the current running sketch
-
-
-void setup() {
-
- pinMode(role_pin, INPUT); // set up the role pin
- digitalWrite(role_pin, HIGH); // Change this to LOW/HIGH instead of using an external pin
- delay(20); // Just to get a solid reading on the role pin
-
- if (digitalRead(role_pin)) // read the role_pin pin to establish our role
- role = role_sender;
- else
- role = role_receiver;
-
-
- Serial.begin(115200);
- printf_begin(); // needed for printDetails()
-
- // print introduction
- Serial.print(F("\n\rRF24/examples/pingpair_irq\n\rROLE: "));
- Serial.println(role_friendly_name[role]);
-
-
- /********************** Setup and configure rf radio *********************/
- radio.begin();
-
- // Examples are usually run with both radios in close proximity to each other
- radio.setPALevel(RF24_PA_LOW); // defaults to RF24_PA_MAX
- radio.enableAckPayload(); // We will be using the ACK Payload feature which is not enabled by default
- radio.enableDynamicPayloads(); // Ack payloads are dynamic payloads
-
- // Open a writing and reading pipe on each radio, with opposite addresses
- if (role == role_sender) {
- radio.openWritingPipe(address[0]);
- radio.openReadingPipe(1, address[1]);
- } else {
- radio.openWritingPipe(address[1]);
- radio.openReadingPipe(1, address[0]);
- radio.startListening(); // First we need to start listening
-
- // Add an ACK payload for the first time around; 1 is the pipe number to acknowledge
- radio.writeAckPayload(1, &message_count, sizeof(message_count));
- ++message_count; // increment counter by 1 for next ACK payload
- }
-
- radio.printDetails(); // Dump the configuration of the rf unit for debugging
- delay(50);
-
- // Attach interrupt handler to interrupt #0 (using pin 2) on BOTH the sender and receiver
- attachInterrupt(0, check_radio, LOW);
-} // setup
-
-
-void loop() {
-
-
- /****************** Ping Out Role ***************************/
-
- if (role == role_sender) {
- // Repeatedly send the current time
-
- unsigned long time = millis(); // Take the time
- Serial.print(F("Now sending "));
- Serial.println(time);
- radio.startWrite(&time, sizeof(unsigned long), 0); // Send the time
- delay(2000); // Try again soon (in 2 seconds)
- }
-
-
- /****************** Pong Back Role ***************************/
- // Receiver does nothing! All the work is in Interrupt Handler
-
- if (role == role_receiver) {}
-
-} // loop
-
-
-/********************** Interrupt Handler *********************/
-
-void check_radio(void) {
-
- bool tx, fail, rx; // declare variables to store IRQ flags
- radio.whatHappened(tx, fail, rx); // What happened?
-
- if (tx) { // Have we successfully transmitted?
- if (role == role_sender)
- Serial.println(F("Send:OK"));
- if (role == role_receiver)
- Serial.println(F("Ack Payload:Sent"));
- }
-
- if (fail) { // Have we failed to transmit?
- if (role == role_sender)
- Serial.println(F("Send:Failed"));
- if (role == role_receiver)
- Serial.println(F("Ack Payload:Failed"));
- }
-
- if (rx || radio.available()) { // Did we receive a message?
-
-
-
-
- /**************** Ping Out Role (about received ACK payload) ************************/
- // If we're the sender, we've received an ack payload
- if (role == role_sender) {
- // Get the payload and dump it
- radio.read(&message_count, sizeof(message_count));
- Serial.print(F("Ack: "));
- Serial.println(message_count);
- }
-
-
- /****************** Pong Back Role ***************************/
- // If we're the receiver, we've received a time message
- if (role == role_receiver) {
- // Get the payload and dump it
-
- static unsigned long got_time; // variable to hold the received time
- radio.read(&got_time, sizeof(got_time)); // get the payload
- Serial.print(F("Got payload "));
- Serial.println(got_time);
-
- // Add an ACK payload for the next time around; 1 is the pipe number to acknowledge
- radio.writeAckPayload(1, &message_count, sizeof(message_count));
- ++message_count; // increment packet counter
- }
- }
-} // check_radio
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_multi_dyn/pingpair_multi_dyn.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_multi_dyn/pingpair_multi_dyn.ino
deleted file mode 100644
index 8e32879..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_multi_dyn/pingpair_multi_dyn.ino
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- Copyright (C) 2011 James Coliz, Jr. <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-*/
-
-/**
- Example using Dynamic Payloads
-
- This is an example of how to use payloads of a varying (dynamic) size.
-*/
-
-#include <SPI.h>
-#include "RF24.h"
-
-//
-// Hardware configuration
-//
-
-// Set up nRF24L01 radio on SPI bus plus pins 8 & 9
-RF24 radio(7, 8);
-
-// Use multicast?
-// sets the multicast behavior this unit in hardware. Connect to GND to use unicast
-// Leave open (default) to use multicast.
-const int multicast_pin = 6;
-
-// sets the role of this unit in hardware. Connect to GND to be the 'pong' receiver
-// Leave open to be the 'ping' transmitter
-const int role_pin = 5;
-bool multicast = true;
-
-//
-// Topology
-//
-
-// Radio pipe addresses for the 2 nodes to communicate.
-const uint64_t pipes[2] = { 0xEEFAFDFDEELL, 0xEEFDFAF50DFLL };
-
-//
-// Role management
-//
-// Set up role. This sketch uses the same software for all the nodes
-// in this system. Doing so greatly simplifies testing. The hardware itself specifies
-// which node it is.
-//
-// This is done through the role_pin
-//
-
-// The various roles supported by this sketch
-typedef enum { role_ping_out = 1,
- role_pong_back } role_e;
-
-// The debug-friendly names of those roles
-const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back" };
-
-// The role of the current running sketch
-role_e role;
-
-//
-// Payload
-//
-
-const int min_payload_size = 1;
-const int max_payload_size = 32;
-const int payload_size_increments_by = 1;
-int next_payload_size = min_payload_size;
-
-char receive_payload[max_payload_size + 1]; // +1 to allow room for a terminating NULL char
-
-void setup(void) {
- //
- // Multicast
- //
- pinMode(multicast_pin, INPUT);
- digitalWrite(multicast_pin, HIGH);
- delay(20);
-
- // read multicast role, LOW for unicast
- if (digitalRead(multicast_pin))
- multicast = true;
- else
- multicast = false;
-
-
- //
- // Role
- //
-
- // set up the role pin
- pinMode(role_pin, INPUT);
- digitalWrite(role_pin, HIGH);
- delay(20); // Just to get a solid reading on the role pin
-
- // read the address pin, establish our role
- if (digitalRead(role_pin))
- role = role_ping_out;
- else
- role = role_pong_back;
-
- //
- // Print preamble
- //
-
- Serial.begin(115200);
-
- Serial.println(F("RF24/examples/pingpair_multi_dyn/"));
- Serial.print(F("ROLE: "));
- Serial.println(role_friendly_name[role]);
-
- Serial.print(F("MULTICAST: "));
- Serial.println(multicast ? F("true (unreliable)") : F("false (reliable)"));
-
- //
- // Setup and configure rf radio
- //
-
- radio.begin();
-
- // enable dynamic payloads
- radio.enableDynamicPayloads();
- radio.setCRCLength(RF24_CRC_16);
-
- // optionally, increase the delay between retries & # of retries
- radio.setRetries(15, 5);
- radio.setAutoAck(true);
- //radio.setPALevel( RF24_PA_LOW ) ;
-
- //
- // Open pipes to other nodes for communication
- //
-
- // This simple sketch opens two pipes for these two nodes to communicate
- // back and forth.
- // Open 'our' pipe for writing
- // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)
-
- if (role == role_ping_out) {
- radio.openWritingPipe(pipes[0]);
- radio.openReadingPipe(1, pipes[1]);
- } else {
- radio.openWritingPipe(pipes[1]);
- radio.openReadingPipe(1, pipes[0]);
- }
-
- //
- // Start listening
- //
- radio.powerUp();
- radio.startListening();
-
- //
- // Dump the configuration of the rf unit for debugging
- //
-
- radio.printDetails();
-}
-
-void loop(void) {
- //
- // Ping out role. Repeatedly send the current time
- //
-
- if (role == role_ping_out) {
- // The payload will always be the same, what will change is how much of it we send.
- static char send_payload[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ789012";
-
- // First, stop listening so we can talk.
- radio.stopListening();
-
- // Take the time, and send it. This will block until complete
- Serial.print(F("Now sending length "));
- Serial.println(next_payload_size);
- radio.write(send_payload, next_payload_size, multicast);
-
- // Now, continue listening
- radio.startListening();
-
- // Wait here until we get a response, or timeout
- unsigned long started_waiting_at = millis();
- bool timeout = false;
- while (!radio.available() && !timeout)
- if (millis() - started_waiting_at > 500)
- timeout = true;
-
- // Describe the results
- if (timeout) {
- Serial.println(F("Failed, response timed out."));
- } else {
- // Grab the response, compare, and send to debugging spew
- uint8_t len = radio.getDynamicPayloadSize();
- radio.read(receive_payload, len);
-
- // Put a zero at the end for easy printing
- receive_payload[len] = 0;
-
- // Spew it
- Serial.print(F("Got response size="));
- Serial.print(len);
- Serial.print(F(" value="));
- Serial.println(receive_payload);
- }
-
- // Update size for next time.
- next_payload_size += payload_size_increments_by;
- if (next_payload_size > max_payload_size)
- next_payload_size = min_payload_size;
-
- // Try again 1s later
- delay(250);
- }
-
- //
- // Pong back role. Receive each packet, dump it out, and send it back
- //
-
- if (role == role_pong_back) {
- // if there is data ready
- if (radio.available()) {
- // Dump the payloads until we've gotten everything
- uint8_t len;
- bool done = false;
- while (radio.available()) {
- // Fetch the payload, and see if this was the last one.
- len = radio.getDynamicPayloadSize();
- radio.read(receive_payload, len);
-
- // Put a zero at the end for easy printing
- receive_payload[len] = 0;
-
- // Spew it
- Serial.print(F("Got response size="));
- Serial.print(len);
- Serial.print(F(" value="));
- Serial.println(receive_payload);
- }
-
- // First, stop listening so we can talk
- radio.stopListening();
-
- // Send the final one back.
- radio.write(receive_payload, len, multicast);
- Serial.println(F("Sent response."));
-
- // Now, resume listening so we catch the next packets.
- radio.startListening();
- }
- }
-}
-// vim:cin:ai:sts=2 sw=2 ft=cpp
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_sleepy/pingpair_sleepy.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_sleepy/pingpair_sleepy.ino
deleted file mode 100644
index c3beec8..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/pingpair_sleepy/pingpair_sleepy.ino
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-
- TMRh20 2014 - Updates to the library allow sleeping both in TX and RX modes:
- TX Mode: The radio can be powered down (.9uA current) and the Arduino slept using the watchdog timer
- RX Mode: The radio can be left in standby mode (22uA current) and the Arduino slept using an interrupt pin
-*/
-
-/**
- Example RF Radio Ping Pair which Sleeps between Sends
-
- This is an example of how to use the RF24 class to create a battery-
- efficient system. It is just like the GettingStarted_CallResponse example, but the
- ping node powers down the radio and sleeps the MCU after every
- ping/pong cycle, and the receiver sleeps between payloads.
-
- Write this sketch to two different nodes,
- connect the role_pin to ground on one. The ping node sends the current
- time to the pong node, which responds by sending the value back. The ping
- node can then see how long the whole cycle took.
-*/
-
-#include <SPI.h>
-#include <avr/sleep.h>
-#include <avr/power.h>
-#include "nRF24L01.h"
-#include "RF24.h"
-#include "printf.h"
-
-
-// Set up nRF24L01 radio on SPI bus plus pins 7 & 8
-RF24 radio(7, 8);
-
-// sets the role of this unit in hardware. Connect to GND to be the 'pong' receiver
-// Leave open to be the 'ping' transmitter
-const int role_pin = 5;
-
-const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; // Radio pipe addresses for the 2 nodes to communicate.
-
-// Role management
-// Set up role. This sketch uses the same software for all the nodes
-// in this system. Doing so greatly simplifies testing. The hardware itself specifies
-// which node it is.
-
-// The various roles supported by this sketch
-typedef enum { role_ping_out = 1,
- role_pong_back } role_e;
-
-// The debug-friendly names of those roles
-const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back" };
-
-// The role of the current running sketch
-role_e role;
-
-
-// Sleep declarations
-typedef enum { wdt_16ms = 0,
- wdt_32ms,
- wdt_64ms,
- wdt_128ms,
- wdt_250ms,
- wdt_500ms,
- wdt_1s,
- wdt_2s,
- wdt_4s,
- wdt_8s } wdt_prescalar_e;
-
-void setup_watchdog(uint8_t prescalar);
-void do_sleep(void);
-
-const short sleep_cycles_per_transmission = 4;
-volatile short sleep_cycles_remaining = sleep_cycles_per_transmission;
-
-
-
-void setup() {
-
- // set up the role pin
- pinMode(role_pin, INPUT);
- digitalWrite(role_pin, HIGH);
- delay(20); // Just to get a solid reading on the role pin
-
- // read the address pin, establish our role
- if (digitalRead(role_pin))
- role = role_ping_out;
- else
- role = role_pong_back;
-
- Serial.begin(115200);
- printf_begin();
- Serial.print(F("\n\rRF24/examples/pingpair_sleepy/\n\rROLE: "));
- Serial.println(role_friendly_name[role]);
-
- // Prepare sleep parameters
- // Only the ping out role uses WDT. Wake up every 4s to send a ping
- //if ( role == role_ping_out )
- setup_watchdog(wdt_4s);
-
- // Setup and configure rf radio
-
- radio.begin();
-
- // Open pipes to other nodes for communication
-
- // This simple sketch opens two pipes for these two nodes to communicate
- // back and forth.
- // Open 'our' pipe for writing
- // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)
-
- if (role == role_ping_out) {
- radio.openWritingPipe(pipes[0]);
- radio.openReadingPipe(1, pipes[1]);
- } else {
- radio.openWritingPipe(pipes[1]);
- radio.openReadingPipe(1, pipes[0]);
- }
-
- // Start listening
- radio.startListening();
-
- // Dump the configuration of the rf unit for debugging
- //radio.printDetails();
-}
-
-void loop() {
-
-
- if (role == role_ping_out) { // Ping out role. Repeatedly send the current time
- radio.powerUp(); // Power up the radio after sleeping
- radio.stopListening(); // First, stop listening so we can talk.
-
- unsigned long time = millis(); // Take the time, and send it.
- Serial.print(F("Now sending... "));
- Serial.println(time);
-
- radio.write(&time, sizeof(unsigned long));
-
- radio.startListening(); // Now, continue listening
-
- unsigned long started_waiting_at = millis(); // Wait here until we get a response, or timeout (250ms)
- bool timeout = false;
- while (!radio.available()) {
- if (millis() - started_waiting_at > 250) { // Break out of the while loop if nothing available
- timeout = true;
- break;
- }
- }
-
- if (timeout) { // Describe the results
- Serial.println(F("Failed, response timed out."));
- } else {
- unsigned long got_time; // Grab the response, compare, and send to debugging spew
- radio.read(&got_time, sizeof(unsigned long));
-
- printf("Got response %lu, round-trip delay: %lu\n\r", got_time, millis() - got_time);
- }
-
- // Shut down the system
- delay(500); // Experiment with some delay here to see if it has an effect
- // Power down the radio.
- radio.powerDown(); // NOTE: The radio MUST be powered back up again manually
-
- // Sleep the MCU.
- do_sleep();
- }
-
-
- // Pong back role. Receive each packet, dump it out, and send it back
- if (role == role_pong_back) {
-
- if (radio.available()) { // if there is data ready
-
- unsigned long got_time;
- while (radio.available()) { // Dump the payloads until we've gotten everything
- radio.read(&got_time, sizeof(unsigned long)); // Get the payload, and see if this was the last one.
- // Spew it. Include our time, because the ping_out millis counter is unreliable
- printf("Got payload %lu @ %lu...", got_time, millis()); // due to it sleeping
- }
-
- radio.stopListening(); // First, stop listening so we can talk
- radio.write(&got_time, sizeof(unsigned long)); // Send the final one back.
- Serial.println(F("Sent response."));
- radio.startListening(); // Now, resume listening so we catch the next packets.
- } else {
- Serial.println(F("Sleeping"));
- delay(50); // Delay so the serial data can print out
- do_sleep();
- }
- }
-}
-
-void wakeUp() {
- sleep_disable();
-}
-
-// Sleep helpers
-
-//Prescaler values
-// 0=16ms, 1=32ms,2=64ms,3=125ms,4=250ms,5=500ms
-// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
-
-void setup_watchdog(uint8_t prescalar) {
-
- uint8_t wdtcsr = prescalar & 7;
- if (prescalar & 8)
- wdtcsr |= _BV(WDP3);
- MCUSR &= ~_BV(WDRF); // Clear the WD System Reset Flag
- WDTCSR = _BV(WDCE) | _BV(WDE); // Write the WD Change enable bit to enable changing the prescaler and enable system reset
- WDTCSR = _BV(WDCE) | wdtcsr | _BV(WDIE); // Write the prescalar bits (how long to sleep, enable the interrupt to wake the MCU
-}
-
-ISR(WDT_vect) {
- //--sleep_cycles_remaining;
- Serial.println(F("WDT"));
-}
-
-void do_sleep(void) {
- set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
- sleep_enable();
- attachInterrupt(0, wakeUp, LOW);
- WDTCSR |= _BV(WDIE);
- sleep_mode(); // System sleeps here
- // The WDT_vect interrupt wakes the MCU from here
- sleep_disable(); // System continues execution here when watchdog timed out
- detachInterrupt(0);
- WDTCSR &= ~_BV(WDIE);
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/led_remote/led_remote.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/led_remote/led_remote.ino
deleted file mode 100644
index 6ec865e..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/led_remote/led_remote.ino
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-*/
-
-/**
- Example LED Remote
-
- This is an example of how to use the RF24 class to control a remote
- bank of LED's using buttons on a remote control.
-
- On the 'remote', connect any number of buttons or switches from
- an arduino pin to ground. Update 'button_pins' to reflect the
- pins used.
-
- On the 'led' board, connect the same number of LED's from an
- arduino pin to a resistor to ground. Update 'led_pins' to reflect
- the pins used. Also connect a separate pin to ground and change
- the 'role_pin'. This tells the sketch it's running on the LED board.
-
- Every time the buttons change on the remote, the entire state of
- buttons is send to the led board, which displays the state.
-*/
-
-#include <SPI.h>
-#include "nRF24L01.h"
-#include "RF24.h"
-#include "printf.h"
-
-//
-// Hardware configuration
-//
-
-// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 (CE & CS)
-
-RF24 radio(9, 10);
-
-// sets the role of this unit in hardware. Connect to GND to be the 'led' board receiver
-// Leave open to be the 'remote' transmitter
-const int role_pin = A4;
-
-// Pins on the remote for buttons
-const uint8_t button_pins[] = { 2, 3, 4, 5, 6, 7 };
-const uint8_t num_button_pins = sizeof(button_pins);
-
-// Pins on the LED board for LED's
-const uint8_t led_pins[] = { 2, 3, 4, 5, 6, 7 };
-const uint8_t num_led_pins = sizeof(led_pins);
-
-//
-// Topology
-//
-
-// Single radio pipe address for the 2 nodes to communicate.
-const uint64_t pipe = 0xE8E8F0F0E1LL;
-
-//
-// Role management
-//
-// Set up role. This sketch uses the same software for all the nodes in this
-// system. Doing so greatly simplifies testing. The hardware itself specifies
-// which node it is.
-//
-// This is done through the role_pin
-//
-
-// The various roles supported by this sketch
-typedef enum { role_remote = 1,
- role_led } role_e;
-
-// The debug-friendly names of those roles
-const char* role_friendly_name[] = { "invalid", "Remote", "LED Board" };
-
-// The role of the current running sketch
-role_e role;
-
-//
-// Payload
-//
-
-uint8_t button_states[num_button_pins];
-uint8_t led_states[num_led_pins];
-
-//
-// Setup
-//
-
-void setup(void) {
- //
- // Role
- //
-
- // set up the role pin
- pinMode(role_pin, INPUT);
- digitalWrite(role_pin, HIGH);
- delay(20); // Just to get a solid reading on the role pin
-
- // read the address pin, establish our role
- if (digitalRead(role_pin))
- role = role_remote;
- else
- role = role_led;
-
- //
- // Print preamble
- //
-
- Serial.begin(115200);
- printf_begin();
- printf("\n\rRF24/examples/led_remote/\n\r");
- printf("ROLE: %s\n\r", role_friendly_name[role]);
-
- //
- // Setup and configure rf radio
- //
-
- radio.begin();
-
- //
- // Open pipes to other nodes for communication
- //
-
- // This simple sketch opens a single pipes for these two nodes to communicate
- // back and forth. One listens on it, the other talks to it.
-
- if (role == role_remote) {
- radio.openWritingPipe(pipe);
- } else {
- radio.openReadingPipe(1, pipe);
- }
-
- //
- // Start listening
- //
-
- if (role == role_led)
- radio.startListening();
-
- //
- // Dump the configuration of the rf unit for debugging
- //
-
- radio.printDetails();
-
- //
- // Set up buttons / LED's
- //
-
- // Set pull-up resistors for all buttons
- if (role == role_remote) {
- int i = num_button_pins;
- while (i--) {
- pinMode(button_pins[i], INPUT);
- digitalWrite(button_pins[i], HIGH);
- }
- }
-
- // Turn LED's ON until we start getting keys
- if (role == role_led) {
- int i = num_led_pins;
- while (i--) {
- pinMode(led_pins[i], OUTPUT);
- led_states[i] = HIGH;
- digitalWrite(led_pins[i], led_states[i]);
- }
- }
-}
-
-//
-// Loop
-//
-
-void loop(void) {
- //
- // Remote role. If the state of any button has changed, send the whole state of
- // all buttons.
- //
-
- if (role == role_remote) {
- // Get the current state of buttons, and
- // Test if the current state is different from the last state we sent
- int i = num_button_pins;
- bool different = false;
- while (i--) {
- uint8_t state = !digitalRead(button_pins[i]);
- if (state != button_states[i]) {
- different = true;
- button_states[i] = state;
- }
- }
-
- // Send the state of the buttons to the LED board
- if (different) {
- printf("Now sending...");
- bool ok = radio.write(button_states, num_button_pins);
- if (ok)
- printf("ok\n\r");
- else
- printf("failed\n\r");
- }
-
- // Try again in a short while
- delay(20);
- }
-
- //
- // LED role. Receive the state of all buttons, and reflect that in the LEDs
- //
-
- if (role == role_led) {
- // if there is data ready
- if (radio.available()) {
- // Dump the payloads until we've gotten everything
- while (radio.available()) {
- // Fetch the payload, and see if this was the last one.
- radio.read(button_states, num_button_pins);
-
- // Spew it
- printf("Got buttons\n\r");
-
- // For each button, if the button now on, then toggle the LED
- int i = num_led_pins;
- while (i--) {
- if (button_states[i]) {
- led_states[i] ^= HIGH;
- digitalWrite(led_pins[i], led_states[i]);
- }
- }
- }
- }
- }
-}
-// vim:ai:cin:sts=2 sw=2 ft=cpp
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/nordic_fob/nordic_fob.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/nordic_fob/nordic_fob.ino
deleted file mode 100644
index 894d926..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/nordic_fob/nordic_fob.ino
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- Copyright (C) 2012 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-*/
-
-/**
- Example Nordic FOB Receiver
-
- This is an example of how to use the RF24 class to receive signals from the
- Sparkfun Nordic FOB. Thanks to Kirk Mower for providing test hardware.
-
- See blog post at http://maniacbug.wordpress.com/2012/01/08/nordic-fob/
-*/
-
-#include <SPI.h>
-#include <RF24.h>
-#include "nRF24L01.h"
-#include "printf.h"
-
-//
-// Hardware configuration
-//
-
-// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
-
-RF24 radio(9, 10);
-
-//
-// Payload
-//
-
-struct payload_t {
- uint8_t buttons;
- uint16_t id;
- uint8_t empty;
-};
-
-const char* button_names[] = { "Up", "Down", "Left", "Right", "Center" };
-const int num_buttons = 5;
-
-//
-// Forward declarations
-//
-
-uint16_t flip_endian(uint16_t in);
-
-//
-// Setup
-//
-
-void setup(void) {
- //
- // Print preamble
- //
-
- Serial.begin(115200);
- printf_begin();
- printf("\r\nRF24/examples/nordic_fob/\r\n");
-
- //
- // Setup and configure rf radio according to the built-in parameters
- // of the FOB.
- //
-
- radio.begin();
- radio.setChannel(2);
- radio.setPayloadSize(4);
- radio.setAutoAck(false);
- radio.setCRCLength(RF24_CRC_8);
- radio.openReadingPipe(1, 0xE7E7E7E7E7LL);
-
- //
- // Start listening
- //
-
- radio.startListening();
-
- //
- // Dump the configuration of the rf unit for debugging
- //
-
- radio.printDetails();
-}
-
-//
-// Loop
-//
-
-void loop(void) {
- //
- // Receive each packet, dump it out
- //
-
- // if there is data ready
- if (radio.available()) {
- // Get the packet from the radio
- payload_t payload;
- radio.read(&payload, sizeof(payload));
-
- // Print the ID of this message. Note that the message
- // is sent 'big-endian', so we have to flip it.
- printf("#%05u Buttons ", flip_endian(payload.id));
-
- // Print the name of each button
- int i = num_buttons;
- while (i--) {
- if (!(payload.buttons & _BV(i))) {
- printf("%s ", button_names[i]);
- }
- }
-
- // If no buttons, print None
- if (payload.buttons == _BV(num_buttons) - 1)
- printf("None");
-
- printf("\r\n");
- }
-}
-
-//
-// Helper functions
-//
-
-// Change a big-endian word into a little-endian
-uint16_t flip_endian(uint16_t in) {
- uint16_t low = in >> 8;
- uint16_t high = in << 8;
-
- return high | low;
-}
-
-// vim:cin:ai:sts=2 sw=2 ft=cpp
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/main.cpp b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/main.cpp
deleted file mode 100644
index be3ea98..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/main.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifdef MAPLE_IDE
-
-#include <stdio.h>
-#include "wirish.h"
-
-extern void setup(void);
-extern void loop(void);
-
-void board_start(const char* program_name) {
- // Set up the LED to steady on
- pinMode(BOARD_LED_PIN, OUTPUT);
- digitalWrite(BOARD_LED_PIN, HIGH);
-
- // Setup the button as input
- pinMode(BOARD_BUTTON_PIN, INPUT);
- digitalWrite(BOARD_BUTTON_PIN, HIGH);
-
- SerialUSB.begin();
- SerialUSB.println("Press BUT");
-
- // Wait for button press
- while (!isButtonPressed()) {
- }
-
- SerialUSB.println("Welcome!");
- SerialUSB.println(program_name);
-
- int i = 11;
- while (i--) {
- toggleLED();
- delay(50);
- }
-}
-
-/**
- Custom version of _write, which will print to the USB.
- In order to use it you MUST ADD __attribute__((weak))
- to _write in libmaple/syscalls.c
-*/
-extern "C" int _write(int file, char* ptr, int len) {
- if ((file != 1) && (file != 2))
- return 0;
- else
- SerialUSB.write(ptr, len);
- return len;
-}
-
-/**
- Re-entrant version of _write. Yagarto and Devkit now use
- the re-entrant newlib, so these get called instead of the
- non_r versions.
-*/
-extern "C" int _write_r(void*, int file, char* ptr, int len) {
- return _write(file, ptr, len);
-}
-
-__attribute__((constructor)) __attribute__((weak)) void premain() {
- init();
-}
-
-__attribute__((weak)) void setup(void) {
- board_start("No program defined");
-}
-
-__attribute__((weak)) void loop(void) {
-}
-
-__attribute__((weak)) int main(void) {
- setup();
-
- while (true) {
- loop();
- }
- return 0;
-}
-#endif // ifdef MAPLE_IDE
-// vim:cin:ai:sts=2 sw=2 ft=cpp
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/pingpair_maple.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/pingpair_maple.ino
deleted file mode 100644
index e1b0511..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/pingpair_maple/pingpair_maple.ino
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-*/
-
-/**
- Example RF Radio Ping Pair ... for Maple
-
- This is an example of how to use the RF24 class. Write this sketch to two different nodes,
- connect the role_pin to ground on one. The ping node sends the current time to the pong node,
- which responds by sending the value back. The ping node can then see how long the whole cycle
- took.
-*/
-
-#include "WProgram.h"
-#include <SPI.h>
-#include "nRF24L01.h"
-#include "RF24.h"
-
-//
-// Maple specific setup. Other than this section, the sketch is the same on Maple as on
-// Arduino
-//
-
-#ifdef MAPLE_IDE
-
-// External startup function
-extern void board_start(const char* program_name);
-
-// Use SPI #2.
-HardwareSPI SPI(2);
-
-#else
-#define board_startup printf
-#define toggleLED(x) (x)
-#endif
-
-//
-// Hardware configuration
-//
-
-// Set up nRF24L01 radio on SPI bus plus pins 7 & 6
-// (This works for the Getting Started board plugged into the
-// Maple Native backwards.)
-
-RF24 radio(7, 6);
-
-// sets the role of this unit in hardware. Connect to GND to be the 'pong' receiver
-// Leave open to be the 'ping' transmitter
-const int role_pin = 10;
-
-//
-// Topology
-//
-
-// Radio pipe addresses for the 2 nodes to communicate.
-const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
-
-//
-// Role management
-//
-// Set up role. This sketch uses the same software for all the nodes
-// in this system. Doing so greatly simplifies testing. The hardware itself specifies
-// which node it is.
-//
-// This is done through the role_pin
-//
-
-// The various roles supported by this sketch
-typedef enum { role_ping_out = 1,
- role_pong_back } role_e;
-
-// The debug-friendly names of those roles
-const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back" };
-
-// The role of the current running sketch
-role_e role;
-
-void setup(void) {
- //
- // Role
- //
-
- // set up the role pin
- pinMode(role_pin, INPUT);
- digitalWrite(role_pin, HIGH);
- delay(20); // Just to get a solid reading on the role pin
-
- // read the address pin, establish our role
- if (digitalRead(role_pin))
- role = role_ping_out;
- else
- role = role_pong_back;
-
- //
- // Print preamble
- //
-
- board_start("\n\rRF24/examples/pingpair/\n\r");
- printf("ROLE: %s\n\r", role_friendly_name[role]);
-
- //
- // Setup and configure rf radio
- //
-
- radio.begin();
-
- // optionally, increase the delay between retries & # of retries
- radio.setRetries(15, 15);
-
- // optionally, reduce the payload size. seems to
- // improve reliability
- radio.setPayloadSize(8);
-
- //
- // Open pipes to other nodes for communication
- //
-
- // This simple sketch opens two pipes for these two nodes to communicate
- // back and forth.
- // Open 'our' pipe for writing
- // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)
-
- if (role == role_ping_out) {
- radio.openWritingPipe(pipes[0]);
- radio.openReadingPipe(1, pipes[1]);
- } else {
- radio.openWritingPipe(pipes[1]);
- radio.openReadingPipe(1, pipes[0]);
- }
-
- //
- // Start listening
- //
-
- radio.startListening();
-
- //
- // Dump the configuration of the rf unit for debugging
- //
-
- radio.printDetails();
-}
-
-void loop(void) {
- //
- // Ping out role. Repeatedly send the current time
- //
-
- if (role == role_ping_out) {
- toggleLED();
-
- // First, stop listening so we can talk.
- radio.stopListening();
-
- // Take the time, and send it. This will block until complete
- unsigned long time = millis();
- printf("Now sending %lu...", time);
- bool ok = radio.write(&time, sizeof(unsigned long));
-
- if (ok)
- printf("ok...\r\n");
- else
- printf("failed.\r\n");
-
- // Now, continue listening
- radio.startListening();
-
- // Wait here until we get a response, or timeout (250ms)
- unsigned long started_waiting_at = millis();
- bool timeout = false;
- while (!radio.available() && !timeout)
- if (millis() - started_waiting_at > 200)
- timeout = true;
-
- // Describe the results
- if (timeout) {
- printf("Failed, response timed out.\r\n");
- } else {
- // Grab the response, compare, and send to debugging spew
- unsigned long got_time;
- radio.read(&got_time, sizeof(unsigned long));
-
- // Spew it
- printf("Got response %lu, round-trip delay: %lu\r\n", got_time, millis() - got_time);
- }
-
- toggleLED();
-
- // Try again 1s later
- delay(1000);
- }
-
- //
- // Pong back role. Receive each packet, dump it out, and send it back
- //
-
- if (role == role_pong_back) {
- // if there is data ready
- if (radio.available()) {
- // Dump the payloads until we've gotten everything
- unsigned long got_time;
- bool done = false;
- while (!done) {
- // Fetch the payload, and see if this was the last one.
- done = radio.read(&got_time, sizeof(unsigned long));
-
- // Spew it
- printf("Got payload %lu...", got_time);
-
- // Delay just a little bit to let the other unit
- // make the transition to receiver
- delay(20);
- }
-
- // First, stop listening so we can talk
- radio.stopListening();
-
- // Send the final one back.
- radio.write(&got_time, sizeof(unsigned long));
- printf("Sent response.\r\n");
-
- // Now, resume listening so we catch the next packets.
- radio.startListening();
- }
- }
-}
-// vim:cin:ai:sts=2 sw=2 ft=cpp
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/readme.md b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/readme.md
deleted file mode 100644
index c4b3fbb..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/old_backups/recipes/readme.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Recipes
-
-> [!note]
-> These recipe examples may have not been maintained with library updates, and are provided as-is for reference purposes.
-
-> [!warning]
-> These are recipe examples are intended for specific hardware usage.
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/rf24ping85/rf24ping85.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/rf24ping85/rf24ping85.ino
deleted file mode 100644
index 4c5faf3..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/rf24ping85/rf24ping85.ino
+++ /dev/null
@@ -1,204 +0,0 @@
-/**
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * written in 2014 by tong67 (https://github.com/tong67)
- * Updated 2020 by 2bndy5 (http://github.com/2bndy5) for the
- * SpenceKonde ATTinyCore (https://github.com/SpenceKonde/ATTinyCore)
- */
-
-/**
- * The RF24 library uses the [ATTinyCore by
- * SpenceKonde](https://github.com/SpenceKonde/ATTinyCore)
- *
- * This sketch is a duplicate of the ManualAcknowledgements.ino example
- * (without all the Serial input/output code), and it demonstrates
- * a ATTiny25/45/85 or ATTiny24/44/84 driving the nRF24L01 transceiver using
- * the RF24 class to communicate with another node.
- *
- * A simple example of sending data from 1 nRF24L01 transceiver to another
- * with manually transmitted (non-automatic) Acknowledgement (ACK) payloads.
- * This example still uses ACK packets, but they have no payloads. Instead the
- * acknowledging response is sent with `write()`. This tactic allows for more
- * updated acknowledgement payload data, where actual ACK payloads' data are
- * outdated by 1 transmission because they have to loaded before receiving a
- * transmission.
- *
- * This example was written to be used on 2 devices acting as "nodes".
- */
-
-/*
- * ********** Hardware configuration (& schematics) *******************
- *
- * When direct use of 3V does not work (UNO boards tend to have poor 3V supply),
- * use 5V with LED (1.8V ~ 2.2V drop) instead.
- * For low power consumption solutions floating pins (SCK and MOSI) should be
- * pulled HIGH or LOW with 10K resistors.
- *
- * ATTiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 4
- * ^^
- * +-\/-+ //
- * PB5 1|o |8 Vcc --- nRF24L01 VCC --- |<|--- 5V
- * nRF24L01 CE --- PB3 2| |7 PB2 --- nRF24L01 SCK LED
- * nRF24L01 CSN --- PB4 3| |6 PB1 --- nRF24L01 MOSI
- * nRF24L01 GND --- GND 4| |5 PB0 --- nRF24L01 MISO
- * +----+
- *
- * ATTiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 3 => PB3 and PB4 are
- * free to use for other purposes. This "3 pin solution" is from
- * Ralph Doncaster (AKA NerdRalph) which is outlined on his blog at
- * http://nerdralph.blogspot.ca/2014/01/nrf24l01-control-with-3-attiny85-pins.html
- * Original RC combination was 1K/100nF. 22K/10nF combination worked better.
- *
- * For best settle time delay value to use for RF24::csDelay in RF24::csn(), use
- * the examples/rf24_ATTiny/timingSearch3pin/timingSearch3pin.ino sketch.
- *
- * This configuration is enabled in the RF24 library when CE_PIN and
- * CSN_PIN parameters to the constructor are equal. Notice (in the schematic
- * below) that these pins aren't directly to the ATTiny85. Because the CE pin
- * is always HIGH, the power consumption is higher than it would be for the
- * typical 5 pins solution.
- * ^^
- * +-\/-+ nRF24L01 CE --------| //
- * PB5 1|o |8 Vcc --- nRF24L01 VCC -------x----------x--|<|-- 5V
- * PB3 2| |7 PB2 --- nRF24L01 SCK ---|<|---x-[22k]--| LED
- * PB4 3| |6 PB1 --- nRF24L01 MOSI 1n4148 |
- * nRF24L01 GND -x- GND 4| |5 PB0 --- nRF24L01 MISO |
- * | +----+ |
- * |-----------------------------------------||----x-- nRF24L01 CSN
- * 10nF
- *
- * ATTiny24/44/84 Pin map with CE_PIN 8 and CSN_PIN 7 & assuming 1.9V to 3V on VCC
- * Schematic provided and successfully tested by
- * Carmine Pastore (https://github.com/Carminepz)
- *
- * +-\/-+
- * nRF24L01 VCC ---- VCC 1|o |14 GND --- nRF24L01 GND
- * PB0 2| |13 AREF
- * PB1 3| |12 PA1
- * PB3 4| |11 PA2 --- nRF24L01 CE
- * PB2 5| |10 PA3 --- nRF24L01 CSN
- * PA7 6| |9 PA4 --- nRF24L01 SCK
- * nRF24L01 MOSI --- PA6 7| |8 PA5 --- nRF24L01 MISO
- * +----+
- */
-
-#include "SPI.h"
-#include "RF24.h"
-
-// CE and CSN are configurable, specified values for ATTiny85 as connected above
-#define CE_PIN 3
-#define CSN_PIN 4
-//#define CSN_PIN 3 // uncomment for ATTiny85 3 pins solution
-
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// Let these addresses be used for the pair
-uint8_t address[][6] = { "1Node", "2Node" };
-// It is very helpful to think of an address as a path instead of as
-// an identifying device destination
-
-// to use different addresses on a pair of radios, we need a variable to
-// uniquely identify which address this radio will use to transmit
-bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
-
-// Used to control whether this node is sending or receiving
-bool role = false; // true = TX node, false = RX node
-
-// For this example, we'll be using a payload containing
-// a string & an integer number that will be incremented
-// on every successful transmission.
-// Make a data structure to store the entire payload of different datatypes
-struct PayloadStruct {
- char message[7]; // only using 6 characters for TX & RX payloads
- uint8_t counter;
-};
-PayloadStruct payload;
-
-void setup() {
-
- // append a NULL terminating character for printing as a c-string
- payload.message[6] = 0;
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- while (1) {} // hold in infinite loop
- }
-
- // Set the PA Level low to try preventing power supply related problems
- // because these examples are likely run with nodes in close proximity to
- // each other.
- radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
-
- // save on transmission time by setting the radio to only transmit the
- // number of bytes we need to transmit a float
- radio.setPayloadSize(sizeof(payload)); // char[7] & uint8_t datatypes occupy 8 bytes
-
- // set the TX address of the RX node into the TX pipe
- radio.openWritingPipe(address[radioNumber]); // always uses pipe 0
-
- // set the RX address of the TX node into a RX pipe
- radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
-
- if (role) {
- // setup the TX node
-
- memcpy(payload.message, "Hello ", 6); // set the outgoing message
- radio.stopListening(); // put radio in TX mode
- } else {
- // setup the RX node
-
- memcpy(payload.message, "World ", 6); // set the outgoing message
- radio.startListening(); // put radio in RX mode
- }
-} // setup()
-
-void loop() {
-
- if (role) {
- // This device is a TX node
-
- bool report = radio.write(&payload, sizeof(payload)); // transmit & save the report
-
- if (report) {
- // transmission successful; wait for response and print results
-
- radio.startListening(); // put in RX mode
- unsigned long start_timeout = millis(); // timer to detect no response
- while (!radio.available()) { // wait for response or timeout
- if (millis() - start_timeout > 200) // only wait 200 ms
- break;
- }
- radio.stopListening(); // put back in TX mode
-
- // print summary of transactions
- if (radio.available()) { // is there a payload received?
-
- PayloadStruct received;
- radio.read(&received, sizeof(received)); // get payload from RX FIFO
- payload.counter = received.counter; // save incoming counter for next outgoing counter
- }
- } // report
-
- // to make this example readable in the serial monitor
- delay(1000); // slow transmissions down by 1 second
-
- } else {
- // This device is a RX node
-
- if (radio.available()) { // is there a payload?
-
- PayloadStruct received;
- radio.read(&received, sizeof(received)); // get incoming payload
- payload.counter = received.counter + 1; // increment incoming counter for next outgoing response
-
- // transmit response & save result to `report`
- radio.stopListening(); // put in TX mode
-
- radio.writeFast(&payload, sizeof(payload)); // load response to TX FIFO
- radio.txStandBy(150); // keep retrying for 150 ms
-
- radio.startListening(); // put back in RX mode
- }
- } // role
-} // loop
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/timingSearch3pin/timingSearch3pin.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/timingSearch3pin/timingSearch3pin.ino
deleted file mode 100644
index 6a983fa..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/rf24_ATTiny/timingSearch3pin/timingSearch3pin.ino
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * See documentation at https://nRF24.github.io/RF24
- * See License information at root directory of this library
- * written by tong67 (https://github.com/tong67)
- * edited by 2bndy5 (http://github.com/2bndy5) for compatibility with SpenceKonde's ATTinyCore
- */
-
-/*
- * This sketch can determine the best settle time values to use for
- * macros, defined as RF24_CSN_SETTLE_HIGH_DELAY and RF24_CSN_SETTLE_LOW_DELAY,
- * in RF24::csn().
- * The settle time values used here are 100/20. However, these values depend
- * on the actual used RC combination and voltage drop by LED. The
- * intermediate results are written to TX (PB3, pin 2 -- using Serial).
- *
- * For schematic details, see introductory comment block in the
- * examples/rf24_ATTiny/rf24ping85/rf24ping85.ino sketch.
- */
-
-#include <stdio.h>
-#include <SPI.h>
-#include <Arduino.h>
-#include <nRF24L01.h>
-
-
-#if defined(ARDUINO) && !defined(__arm__)
-#if defined(__AVR_ATtinyX5__) || defined(__AVR_ATtinyX4__)
-#define RF24_TINY
-#endif
-#endif
-
-/****************************************************************************/
-
-#if defined(RF24_TINY)
-
-// when Attiny84 or Attiny85 is detected
-#define CE_PIN 3 /** "Chip Enable" pin, activates the RX or TX role */
-#define CSN_PIN 3 /** SPI Chip Select Not */
-
-#else
-// when not running on an ATTiny84 or ATTiny85
-#define CE_PIN 7 /** "Chip Enable" pin, activates the RX or TX role */
-#define CSN_PIN 8 /** SPI Chip Select Not */
-
-#endif
-
-#define MAX_HIGH 100
-#define MAX_LOW 100
-#define MINIMAL 8
-
-// Use these adjustable variables to test for best configuration to be used on
-// the ATTiny chips. These variables are defined as macros in the library's
-// RF24/utility/ATTiny/RF24_arch_config.h file. To change them, simply define
-// the corresponding macro(s) before #include <RF24> in your sketch.
-uint8_t csnHighSettle = MAX_HIGH; // defined as RF24_CSN_SETTLE_HIGH_DELAY
-uint8_t csnLowSettle = MAX_LOW; // defined as RF24_CSN_SETTLE_LOW_DELAY
-
-/****************************************************************************/
-void ce(bool level) {
- if (CE_PIN != CSN_PIN) digitalWrite(CE_PIN, level);
-}
-
-/****************************************************************************/
-void csn(bool mode) {
- if (CE_PIN != CSN_PIN) {
- digitalWrite(CSN_PIN, mode);
- } else {
- // digitalWrite(SCK, mode);
- if (mode == HIGH) {
- PORTB |= (1 << PINB2); // SCK->CSN HIGH
- delayMicroseconds(csnHighSettle); // allow csn to settle
- } else {
- PORTB &= ~(1 << PINB2); // SCK->CSN LOW
- delayMicroseconds(csnLowSettle); // allow csn to settle
- }
- }
-}
-
-/****************************************************************************/
-uint8_t read_register(uint8_t reg) {
- csn(LOW);
- SPI.transfer(reg);
- uint8_t result = SPI.transfer(0xff);
- csn(HIGH);
- return result;
-}
-
-/****************************************************************************/
-void write_register(uint8_t reg, uint8_t value) {
- csn(LOW);
- SPI.transfer(W_REGISTER | reg);
- SPI.transfer(value);
- csn(HIGH);
-}
-
-/****************************************************************************/
-void setup(void) {
-
-#ifndef __AVR_ATtinyX313__
- // not enough memory on ATTiny4313 or ATTint2313(a) to use Serial I/O for this sketch
-
- // start serial port and SPI
- Serial.begin(115200);
- SPI.begin();
- // configure CE and CSN as output when used
- pinMode(CE_PIN, OUTPUT);
- if (CSN_PIN != CE_PIN)
- pinMode(CSN_PIN, OUTPUT);
-
- // csn is used in SPI transfers. Set to LOW at start and HIGH after transfer. Set to HIGH to reflect no transfer active
- // SPI command are accepted in Power Down state.
- // CE pin represent PRX (LOW) or PTX (HIGH) mode apart from register settings. Start in PRX mode.
- ce(LOW);
- csn(HIGH);
-
- // nRF24L01 goes from to Power Down state 100ms after Power on Reset ( Vdd > 1.9V) or when PWR_UP is 0 in config register
- // Goto Power Down state (Powerup or force) and set in transmit mode
- write_register(NRF_CONFIG, read_register(NRF_CONFIG) & ~_BV(PWR_UP) & ~_BV(PRIM_RX));
- delay(100);
-
- // Goto Standby-I
- // Technically we require 4.5ms Tpd2stby+ 14us as a worst case. We'll just call it 5ms for good measure.
- // WARNING: Delay is based on P-variant whereby non-P *may* require different timing.
- write_register(NRF_CONFIG, read_register(NRF_CONFIG) | _BV(PWR_UP));
- delay(5);
-
- // Goto Standby-II
- ce(HIGH);
- Serial.print("Scanning for optimal setting time for csn");
-
-
- /************************** Main program *********************************/
-
- uint8_t result; // used to compare read/write results with read/write cmds
- bool success = true;
- uint8_t bottom_success;
- bool bottom_found;
- uint8_t value[] = { 5, 10 };
- uint8_t limit[] = { MAX_HIGH, MAX_LOW };
- uint8_t advice[] = { MAX_HIGH, MAX_LOW };
-
- // check max values give correct behavior
- for (uint8_t k = 0; k < 2; k++) {
- bottom_found = false;
- bottom_success = 0;
- while (bottom_success < 255) {
- csnHighSettle = limit[0];
- csnLowSettle = limit[1];
- // check current values
- uint8_t i = 0;
- while (i < 255 && success) {
- for (uint8_t j = 0; j < 2; j++) {
- write_register(EN_AA, value[j]);
- result = read_register(EN_AA);
- if (value[j] != result) {
- success = false;
- }
- }
- i++;
- }
- // process result of current values
- if (!success) {
- Serial.print("Settle Not OK. csnHigh=");
- Serial.print(limit[0], DEC);
- Serial.print(" csnLow=");
- Serial.println(limit[1], DEC);
- limit[k]++;
- bottom_found = true;
- bottom_success = 0;
- success = true;
- } else {
- Serial.print("Settle OK. csnHigh=");
- Serial.print(limit[0], DEC);
- Serial.print(" csnLow=");
- Serial.println(limit[1], DEC);
- if (!bottom_found) {
- limit[k]--;
- if (limit[k] == MINIMAL) {
- bottom_found = true;
- bottom_success = 0;
- success = true;
- }
- } else {
- bottom_success++;
- }
- }
- } // while (bottom_success < 255)
- Serial.print("Settle value found for ");
- if (k == 0) {
- Serial.print("csnHigh: ");
- } else {
- Serial.print("csnLow: ");
- }
- Serial.println(limit[k], DEC);
- advice[k] = limit[k] + (limit[k] / 10);
- limit[k] = 100;
- } // for (uint8_t k = 0; k < 2; k++)
- Serial.print("Advised Settle times are: csnHigh=");
- Serial.print(advice[0], DEC);
- Serial.print(" csnLow=");
- Serial.println(advice[1], DEC);
-
-#endif // not defined __AVR_ATtinyX313__
-}
-
-
-void loop(void) {} // this program runs only once, thus it resides in setup()
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/scanner/scanner.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/scanner/scanner.ino
deleted file mode 100644
index d6c7d44..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/scanner/scanner.ino
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
- * Updated 2020 TMRh20
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- */
-
-/**
- * Channel scanner and Continuous Carrier Wave Output
- *
- * Example to detect interference on the various channels available.
- * This is a good diagnostic tool to check whether you're picking a
- * good channel for your application.
- *
- * Run this sketch on two devices. On one device, start emitting a constant carrier wave
- * by sending a channel number in the Serial Monitor. The other device scanning should
- * detect the constant carrier wave from the sending device on the given channel.
- * Send a negative number in the Serial Monitor to stop emitting a constant carrier wave
- * and resume scanning.
- *
- * Inspired by cpixip.
- * See https://forum.arduino.cc/t/poor-mans-2-4-ghz-scanner/54846
- *
- * See documentation at https://nRF24.github.io/RF24
- */
-
-/*
- * How to read the output:
- * - The header is a list of supported channels in decimal written vertically.
- * - Each column corresponding to the vertical header is a hexadecimal count of
- * detected signals (max is 15 or 'f').
- *
- * The following example
- * 000
- * 111
- * 789
- * ~~~ <- just a divider between the channel's vertical labels and signal counts
- * 1-2
- * can be interpreted as
- * - 1 signal detected on channel 17
- * - 0 signals (denoted as '-') detected on channel 18
- * - 2 signals detected on channel 19
- *
- * Each line of signal counts represent 100 passes of the supported spectrum.
- */
-
-#include "RF24.h"
-#include "printf.h"
-
-//
-// Hardware configuration
-//
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-//
-// Channel info
-//
-
-const uint8_t num_channels = 126; // 0-125 are supported
-uint8_t values[num_channels]; // the array to store summary of signal counts per channel
-
-// To detect noise, we'll use the worst addresses possible (a reverse engineering tactic).
-// These addresses are designed to confuse the radio into thinking
-// that the RF signal's preamble is part of the packet/payload.
-const uint8_t noiseAddress[][2] = { { 0x55, 0x55 }, { 0xAA, 0xAA }, { 0xA0, 0xAA }, { 0xAB, 0xAA }, { 0xAC, 0xAA }, { 0xAD, 0xAA } };
-
-const int num_reps = 100; // number of passes for each scan of the entire spectrum
-bool constCarrierMode = 0; // this flag controls example behavior (scan mode is default)
-
-void printHeader(); // prototype function for printing the channels' header
-
-
-void setup(void) {
-
- // Print preamble
- Serial.begin(115200);
- while (!Serial) {
- // some boards need this to wait for Serial connection
- }
- Serial.println(F("RF24/examples/scanner/"));
-
- // Setup and configure rf radio
- if (!radio.begin()) {
- Serial.println(F("radio hardware not responding!"));
- while (true) {
- // hold in an infinite loop
- }
- }
- radio.stopConstCarrier(); // in case MCU was reset while radio was emitting carrier wave
- radio.setAutoAck(false); // Don't acknowledge arbitrary signals
- radio.disableCRC(); // Accept any signal we find
- radio.setAddressWidth(2); // A reverse engineering tactic (not typically recommended)
- for (uint8_t i = 0; i < 6; ++i) {
- radio.openReadingPipe(i, noiseAddress[i]);
- }
-
- // set the data rate
- Serial.print(F("Select your Data Rate. "));
- Serial.print(F("Enter '1' for 1 Mbps, '2' for 2 Mbps, '3' for 250 kbps. "));
- Serial.println(F("Defaults to 1Mbps."));
- while (!Serial.available()) {
- // wait for user input
- }
- uint8_t dataRate = Serial.parseInt();
- if (dataRate == 50) {
- Serial.println(F("Using 2 Mbps."));
- radio.setDataRate(RF24_2MBPS);
- } else if (dataRate == 51) {
- Serial.println(F("Using 250 kbps."));
- radio.setDataRate(RF24_250KBPS);
- } else {
- Serial.println(F("Using 1 Mbps."));
- radio.setDataRate(RF24_1MBPS);
- }
- Serial.println(F("***Enter a channel number to emit a constant carrier wave."));
- Serial.println(F("***Enter a negative number to switch back to scanner mode."));
-
- // Get into standby mode
- radio.startListening();
- radio.stopListening();
- radio.flush_rx();
-
- // printf_begin();
- // radio.printPrettyDetails();
- // delay(1000);
-
- // Print out vertical header
- printHeader();
-}
-
-void loop(void) {
- /****************************************/
- // Send a number over Serial to begin Constant Carrier Wave output
- // Configure the power amplitude level below
- if (Serial.available()) {
- int8_t c = Serial.parseInt();
- if (c >= 0) {
- c = min((int8_t)125, c); // clamp channel to supported range
- constCarrierMode = 1;
- radio.stopListening();
- delay(2);
- Serial.print("\nStarting Carrier Wave Output on channel ");
- Serial.println(c);
- // for non-plus models, startConstCarrier() changes address on pipe 0 and sets address width to 5
- radio.startConstCarrier(RF24_PA_LOW, c);
- } else {
- constCarrierMode = 0;
- radio.stopConstCarrier();
- radio.setAddressWidth(2); // reset address width
- radio.openReadingPipe(0, noiseAddress[0]); // ensure address is looking for noise
- Serial.println("\nStopping Carrier Wave Output");
- printHeader();
- }
-
- // discard any CR and LF sent
- while (Serial.peek() != -1) {
- if (Serial.peek() == '\r' || Serial.peek() == '\n') {
- Serial.read();
- } else { // got a charater that isn't a line feed
- break; // handle it on next loop() iteration
- }
- }
- }
-
- /****************************************/
-
- if (constCarrierMode == 0) {
- // Clear measurement values
- memset(values, 0, sizeof(values));
-
- // Scan all channels num_reps times
- int rep_counter = num_reps;
- while (rep_counter--) {
- int i = num_channels;
- while (i--) {
- // Select this channel
- radio.setChannel(i);
-
- // Listen for a little
- radio.startListening();
- delayMicroseconds(128);
- bool foundSignal = radio.testRPD();
- radio.stopListening();
-
- // Did we get a signal?
- if (foundSignal || radio.testRPD() || radio.available()) {
- ++values[i];
- radio.flush_rx(); // discard packets of noise
- }
- }
- }
-
- // Print out channel measurements, clamped to a single hex digit
- for (int i = 0; i < num_channels; ++i) {
- if (values[i])
- Serial.print(min((uint8_t)0xf, values[i]), HEX);
- else
- Serial.print(F("-"));
- }
- Serial.println();
-
- } // if constCarrierMode == 0
- else {
- // show some output to prove that the program isn't bricked
- Serial.print(F("."));
- delay(1000); // delay a second to keep output readable
- }
-} // end loop()
-
-void printHeader() {
- // Print the hundreds digits
- for (uint8_t i = 0; i < num_channels; ++i)
- Serial.print(i / 100);
- Serial.println();
-
- // Print the tens digits
- for (uint8_t i = 0; i < num_channels; ++i)
- Serial.print((i % 100) / 10);
- Serial.println();
-
- // Print the singles digits
- for (uint8_t i = 0; i < num_channels; ++i)
- Serial.print(i % 10);
- Serial.println();
-
- // Print the header's divider
- for (uint8_t i = 0; i < num_channels; ++i)
- Serial.print(F("~"));
- Serial.println();
-} \ No newline at end of file
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/scannerGraphic/scannerGraphic.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples/scannerGraphic/scannerGraphic.ino
deleted file mode 100644
index ddbed5a..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples/scannerGraphic/scannerGraphic.ino
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (C) 2022 Brendan Doherty <2bndy5@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- */
-
-/*
- * This example uses 1 of 2 different popular displays. To control which display to use,
- * comment/uncomment the lines below that define
- * - `SPI_DISPLAY`: This requires the "Adafruit ST7735 and ST7789 Library" installed
- * - `I2C_DISPLAY`: This requires the "Adafruit SSD1306" library installed
- *
- * Use the Arduino Library manager to ensure the required libraries are installed.
- * By default, this sketch uses the SPI_DISPLAY (ST7789). Using both displays at the same
- * time is not supported by this sketch.
- *
- * NOTES:
- * The `SCREEN_HEIGHT` and `SCREEN_WIDTH` defines may need to be adjusted according
- * to your display module's capability. This example expects the display to be at
- * least 128 pixels wide. Otherwise, you would have to reduce the `numChannels`
- * constant to fit within your display's width.
- *
- * The SPI_DISPLAY uses its own pins defined by `TFT_CS`, `TFT_DC`, and the
- * optional `TFT_RST` (see below). The SPI bus is shared between radio and display,
- * so the display's CS pin must be connected as specified by `TFT_CS`.
- * If your ST7789 display does not have a CS pin, then further modification must
- * be made so it does not use the same SPI bus that the radio uses.
- *
- * `DEBUGGING` can be enabled (uncommented) to show Serial output. This is just a
- * convenience to set radio data rate or further development. See our other
- * RF24/scanner example that only uses the Serial Monitor instead of a graphic
- * display.
- *
- * See documentation at https://nRF24.github.io/RF24
- */
-#include <Adafruit_GFX.h> // dependency of Adafruit display libraries
-#include "RF24.h"
-
-/********************************************************************
- * CHOOSE A DISPLAY INTERFACE
- * uncomment/comment only 1 of the following to use the desired display
- ********************************************************************/
-// #define I2C_DISPLAY // using the SSD1306
-#define SPI_DISPLAY // using ST7789
-
-/********************************************************************
- * Choose a sketch feature
- * uncomment any of the following to enable a special feature
- ********************************************************************/
-// #define DEBUGGING // uncomment to enable Serial output (optional)
-// #define HOLD_PEAKS // uncomment to disable decay of maxPeak pixels (useful for assessing total noise)
-
-/********************************************************************
- * Instantiate the radio and app-specific attributes
- ********************************************************************/
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-// To detect noise, we'll use the worst addresses possible (a reverse engineering tactic).
-// These addresses are designed to confuse the radio into thinking
-// that the RF signal's preamble is part of the packet/payload.
-const uint8_t noiseAddress[][2] = { { 0x55, 0x55 }, { 0xAA, 0xAA }, { 0xA0, 0xAA }, { 0xAB, 0xAA }, { 0xAC, 0xAA }, { 0xAD, 0xAA } };
-
-const uint8_t numChannels = 126; // 0-125 are supported
-
-/***********************************************************************
- * Declare caching mechanism to track history of signals for peak decay
- **********************************************************************/
-
-const uint8_t cacheMax = 4;
-
-/// A data structure to organize the cache of signals for a certain channel.
-struct ChannelHistory {
- /// max peak value is (at most) 2 * CACHE_MAX to allow for half-step decays
- uint8_t maxPeak = 0;
-
- /// Push a signal's value into cached history while popping
- /// oldest cached value. This also sets the maxPeak value.
- /// @returns The sum of signals found in the cached history
- uint8_t push(bool value) {
- uint8_t sum = value;
- for (uint8_t i = 0; i < cacheMax - 1; ++i) {
- history[i] = history[i + 1];
- sum += history[i];
- }
- history[cacheMax - 1] = value;
- maxPeak = max((uint8_t)(sum * 2), maxPeak); // sum * 2 to allow half-step decay
- return sum;
- }
-
-private:
- bool history[cacheMax] = { 0 };
-};
-
-/// An array of caches to use as channels' history
-ChannelHistory stored[numChannels];
-
-/********************************************************************
- * Instantiate the appropriate display objects according to the
- * defines (above near top of file)
- ********************************************************************/
-
-#ifdef I2C_DISPLAY
-
-#include <Wire.h>
-#include <Adafruit_SSD1306.h>
-
-#define SCREEN_WIDTH 128 // OLED display width, in pixels
-#define SCREEN_HEIGHT 64 // OLED display height, in pixels
-
-// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
-// The pins for I2C are defined by the Wire-library.
-// On an arduino UNO: A4(SDA), A5(SCL)
-// On an arduino MEGA 2560: 20(SDA), 21(SCL)
-// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
-#define OLED_RESET -1 // Or set to -1 and connect to Arduino RESET pin
-#define SCREEN_ADDRESS 0x3D // See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
-Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
-
-#define BLACK SSD1306_BLACK
-#define WHITE SSD1306_WHITE
-#define REFRESH ({ display.display(); })
-#define CLEAR_DISPLAY ({ display.clearDisplay(); })
-
-#elif defined(SPI_DISPLAY)
-
-#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
-
-#define TFT_CS 9
-#define TFT_RST -1 // Or set to -1 and connect to Arduino RESET pin
-#define TFT_DC 6
-
-#define SCREEN_WIDTH 135 // TFT display width, in pixels
-#define SCREEN_HEIGHT 240 // TFT display height, in pixels
-
-// For 1.14", 1.3", 1.54", 1.69", and 2.0" TFT with ST7789:
-Adafruit_ST7789 display = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
-
-#define BLACK ST77XX_BLACK
-#define WHITE ST77XX_WHITE
-#define REFRESH
-#define CLEAR_DISPLAY ({ display.fillScreen(BLACK); })
-
-#endif // if defined(I2C_DISPLAY) || defined(SPI_DISPLAY)
-
-// constant chart size attributes
-const uint16_t margin = 1; // use 1 pixel margin for markers on each side of chart
-const uint16_t barWidth = (SCREEN_WIDTH - (margin * 2)) / numChannels;
-const uint16_t chartHeight = SCREEN_HEIGHT - 10;
-const uint16_t chartWidth = margin * 2 + (numChannels * barWidth);
-
-/********************************************************************
- * Configure debugging on Serial output
- ********************************************************************/
-
-#ifdef DEBUGGING
-#include "printf.h"
-#define SERIAL_DEBUG(x) ({ x; })
-#else
-#define SERIAL_DEBUG(x)
-#endif
-
-/********************************************************************
- * Setup the app
- ********************************************************************/
-void setup(void) {
-
-#ifdef DEBUGGING
- // Print preamble
- Serial.begin(115200);
- while (!Serial) {
- // some boards need this to wait for Serial connection
- }
- Serial.println(F("RF24/examples/scannerGraphic"));
-#endif
-
-#ifdef I2C_DISPLAY
- // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
- if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
- SERIAL_DEBUG(Serial.println(F("SSD1306 allocation failed")););
- while (true) {
- // Don't proceed, loop forever
- }
- }
-#elif defined(SPI_DISPLAY)
- // use this initializer for a 1.14" 240x135 TFT:
- display.init(SCREEN_WIDTH, SCREEN_HEIGHT); // Init ST7789 240x135
-#endif
-
- // Clear the buffer
- CLEAR_DISPLAY;
-
- // Setup and configure rf radio
- if (!radio.begin()) {
- SERIAL_DEBUG(Serial.println(F("radio hardware not responding!")););
- display.setCursor(1, 1);
- display.setTextColor(WHITE);
- display.print(F("radio hardware\nnot responding!"));
- REFRESH;
- while (true) {
- // hold in an infinite loop
- }
- }
- displayChartAxis();
-
- radio.setAutoAck(false); // Don't acknowledge arbitrary signals
- radio.disableCRC(); // accept any signal we find
- radio.setAddressWidth(2); // a reverse engineering tactic (not typically recommended)
- for (uint8_t i = 0; i < 6; ++i) {
- radio.openReadingPipe(i, noiseAddress[i]);
- }
-
- // set the data rate
-#ifdef DEBUGGING
- unsigned long inputTimeout = millis() + 7000;
- Serial.print(F("Select your Data Rate. "));
- Serial.println(F("Enter '1' for 1Mbps, '2' for 2Mbps, '3' for 250kbps. Defaults to 1 Mbps."));
- while (!Serial.available() && millis() < inputTimeout) {
- // Wait for user input. Timeout after 7 seconds.
- }
- char dataRate = !Serial.available() ? '1' : Serial.parseInt();
-#else
- char dataRate = '1';
-#endif
- if (dataRate == '2') {
- SERIAL_DEBUG(Serial.println(F("Using 2 Mbps.")););
- radio.setDataRate(RF24_2MBPS);
- } else if (dataRate == '3') {
- SERIAL_DEBUG(Serial.println(F("Using 250 kbps.")););
- radio.setDataRate(RF24_250KBPS);
- } else { // dataRate == '1' or invalid values
- SERIAL_DEBUG(Serial.println(F("Using 1 Mbps.")););
- radio.setDataRate(RF24_1MBPS);
- }
-
- // Get into standby mode
- radio.startListening();
- radio.stopListening();
- radio.flush_rx();
-}
-
-/********************************************************************
- * Make the app loop forever
- ********************************************************************/
-void loop(void) {
- // Print out channel measurements, clamped to a single hex digit
- for (uint8_t channel = 0; channel < numChannels; ++channel) {
- bool foundSignal = scanChannel(channel);
- uint8_t cacheSum = stored[channel].push(foundSignal);
- uint8_t x = (barWidth * channel) + 1 + margin - (barWidth * (bool)channel);
- // reset bar for current channel to 0
- display.fillRect(x, 0, barWidth, chartHeight, BLACK);
- if (stored[channel].maxPeak > cacheSum * 2) {
- // draw a peak line only if it is greater than current sum of cached signal counts
- uint16_t y = chartHeight - (chartHeight * stored[channel].maxPeak / (cacheMax * 2));
- display.drawLine(x, y, x + barWidth, y, WHITE);
-#ifndef HOLD_PEAKS
- stored[channel].maxPeak -= 1; // decrement max peak
-#endif
- }
- if (cacheSum) { // draw the cached signal count
- uint8_t barHeight = chartHeight * cacheSum / cacheMax;
- display.fillRect(x, chartHeight - barHeight, barWidth, barHeight, WHITE);
- }
- }
- REFRESH;
-} // end loop()
-
-/// Scan a specified channel and return the resulting flag
-bool scanChannel(uint8_t channel) {
- radio.setChannel(channel);
-
- // Listen for a little
- radio.startListening();
- delayMicroseconds(130);
- bool foundSignal = radio.testRPD();
- radio.stopListening();
-
- // Did we get a signal?
- if (foundSignal || radio.testRPD() || radio.available()) {
- radio.flush_rx(); // discard packets of noise
- return true;
- }
- return false;
-}
-
-/// Draw the chart axis and labels
-void displayChartAxis() {
- // draw base line
- display.drawLine(0, chartHeight + 1, chartWidth - margin, chartHeight + 1, WHITE);
-
- // draw base line border
- display.drawLine(margin, SCREEN_HEIGHT, margin, chartHeight - 2, WHITE);
- display.drawLine(chartWidth - margin, SCREEN_HEIGHT, chartWidth - margin, chartHeight - 2, WHITE);
-
- // draw scalar marks
- for (uint8_t i = 0; i < cacheMax; ++i) {
- uint8_t scalarHeight = chartHeight * i / cacheMax;
- display.drawLine(0, scalarHeight, chartWidth, scalarHeight, WHITE);
- }
-
- // draw channel range labels
- display.setTextSize(1);
- display.setTextColor(WHITE);
- uint8_t maxChannelDigits = 0;
- uint8_t tmp = numChannels;
- while (tmp) {
- maxChannelDigits += 1;
- tmp /= 10;
- }
- display.setCursor(chartWidth - (7 * maxChannelDigits), chartHeight + 3);
- display.print(numChannels - 1);
- display.setCursor(margin + 2, chartHeight + 3);
- display.print(0);
-
- // refresh display
- REFRESH;
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/README.md b/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/README.md
deleted file mode 100644
index 5d22d64..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# 😀 RF24_EncodeRadioDetails
-
-### Description
-
-An example demonstrating how to get and display debug information from nRF24L01 radios on the Arduino Uno Q using both Arduino & Python
-
-
-### Additional RF24 Examples
-
-See other examples at <https://github.com/TMRh20/Sketches/tree/master/ArduinoQ>. \ No newline at end of file
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/app.yaml b/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/app.yaml
deleted file mode 100644
index c75587f..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/app.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-# app.yaml: The main configuration file for your Arduino App.
-# This file describes the application's metadata and properties.
-
-# The user-visible name of the application.
-name: RF24_EncodeRadioDetails
-
-# A brief description of what the application does.
-description: ""
-
-# The icon for the application, can be an emoji or a short string.
-icon: 😀
-
-# A list of network ports that the application exposes.
-# Example: [80, 443]
-ports: []
-
-# A list of bricks used by this application.
-bricks: []
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/python/main.py b/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/python/main.py
deleted file mode 100644
index d0eb9e7..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/python/main.py
+++ /dev/null
@@ -1,200 +0,0 @@
-"""A simple script to take all data dumped from the nRF24L01 registers and
-output it in human readable form.
-
-Notes:
- * The radio's power state is represented under the assumption that
- the radio's CE pin is inactive low.
-"""
-
-# pylint: disable=consider-using-f-string
-import struct
-import time
-
-from arduino.app_utils import App, Bridge
-
-bufferByteArray = bytearray()
-
-
-def RF24Callback(payload: int):
- """Append a ``payload`` byte to the global ``bufferByteArray``.
- Invokes `print_details()` once the buffer hits a 43 byte length.
-
- Args:
- payload: The incoming byte (a ``uint8_t`` data type from the
- microcontroller) to append.
- """
- bufferByteArray.append(payload)
- if len(bufferByteArray) == 43:
- # once sufficient size warrants call to print_details()
- print_details(bufferByteArray)
- # reset bytearray buffer
- bufferByteArray.clear()
-
-
-Bridge.provide("RF24Callback", RF24Callback)
-
-
-def address_repr(buf, reverse: bool = True, delimit: str = "") -> str:
- """Convert a buffer into a hexadecimal string."""
- order = range(len(buf) - 1, -1, -1) if reverse else range(len(buf))
- return delimit.join(["%02X" % buf[byte] for byte in order])
-
-
-# pylint: disable=too-many-locals,too-many-statements
-def print_details(encoded_buf: bytearray):
- """This debugging function outputs all details about the nRF24L01."""
- # declare sequences
- pipes = [bytearray(5)] * 2 + [0] * 4
- pl_len = [0] * 6
-
- # unpack bytearray
- (
- config, # 0x00
- auto_ack, # 0x01
- open_pipes, # 0x02
- addr_len, # 0x03
- retry_setup, # 0x04
- channel, # 0x05
- rf_setup, # 0x06
- status, # 0x07
- observer, # 0x08
- rpd, # 0x09
- ) = struct.unpack("10B", encoded_buf[:10])
- pipes[0] = encoded_buf[10:15] # 0x0A
- pipes[1] = encoded_buf[15:20] # 0x0B
- (
- pipes[2], # 0x0C
- pipes[3], # 0x0D
- pipes[4], # 0x0E
- pipes[5], # 0x0F
- ) = struct.unpack("4B", encoded_buf[20:24])
- tx_address = encoded_buf[24:29] # 0x10
- (
- pl_len[0], # 0x11
- pl_len[1], # 0x12
- pl_len[2], # 0x13
- pl_len[3], # 0x14
- pl_len[4], # 0x15
- pl_len[5], # 0x16
- fifo, # 0x17
- dyn_pl, # 0x1C
- features, # 0x1D
- ) = struct.unpack("9B", encoded_buf[29:38])
- ce_pin, csn_pin, spi_speed = struct.unpack(">2H1B", encoded_buf[38:44])
-
- # do some deciphering arithmetic
- addr_len += 2
- crc = (2 if config & 4 else 1) if auto_ack else max(0, ((config & 0x0C) >> 2) - 1)
- d_rate = rf_setup & 0x28
- d_rate = (2 if d_rate == 8 else 250) if d_rate else 1
- pa_level = (3 - ((rf_setup & 6) >> 1)) * -6
- pa_level = (
- "MIN"
- if pa_level == -18
- else ("LOW" if pa_level == -12 else ("HIGH" if pa_level == -6 else "MAX"))
- )
- dyn_p = (
- ("_Enabled" if dyn_pl else "Disabled")
- if dyn_pl == 0x3F or not dyn_pl
- else "0b" + "0" * (8 - len(bin(dyn_pl))) + bin(dyn_pl)[2:]
- )
- auto_ack = (
- ("Enabled" if auto_ack else "Disabled")
- if auto_ack == 0x3F or not auto_ack
- else "0b" + "0" * (8 - len(bin(auto_ack))) + bin(auto_ack)[2:]
- )
- pwr = "Standby" if config & 2 else "Off"
- is_plus_variant = bool(spi_speed >> 4)
- spi_speed = spi_speed & 0xF
-
- # print it all out
- print("CE pin____________________{}".format(ce_pin))
- print("CSN pin___________________{}".format(csn_pin))
- print("SPI speed_________________{} MHz".format(spi_speed))
- print("Is a plus variant_________{}".format(is_plus_variant))
- print(
- "Channel___________________{}".format(channel),
- "~ {} GHz".format((channel + 2400) / 1000),
- )
- print(
- "RF Data Rate______________{}".format(d_rate),
- "Mbps" if d_rate != 250 else "Kbps",
- )
- print("RF Power Amplifier________PA_{}".format(pa_level))
- print(
- "RF Low Noise Amplifier____{}abled".format(
- "En" if bool(rf_setup & 1) else "Dis"
- )
- )
- print("CRC Length________________{} bits".format(crc * 8))
- print("Address length____________{} bytes".format(addr_len))
- print("TX Payload lengths________{} bytes".format(pl_len[0]))
- print(
- "Auto retry delay__________{} microseconds".format(
- ((retry_setup & 0xF0) >> 4) * 250 + 250
- )
- )
- print("Auto retry attempts_______{} maximum".format(retry_setup & 0x0F))
- print("Re-use TX FIFO____________{}".format(bool(fifo & 64)))
- print("Received Power Detected___{}".format(bool(rpd)))
- print(
- "Packets lost on current channel_____________________{}".format(observer >> 4)
- )
- print(
- "Retry attempts made for last transmission___________{}".format(observer & 0xF)
- )
- print(
- "IRQ on Data Ready__{}abled".format("Dis" if config & 64 else "_En"),
- " Data Ready___________{}".format(bool(status & 0x40)),
- )
- print(
- "IRQ on Data Sent___{}abled".format("Dis" if config & 32 else "_En"),
- " Data Sent____________{}".format(bool(status & 0x20)),
- )
- print(
- "IRQ on Data Fail___{}abled".format("Dis" if config & 16 else "_En"),
- " Data Failed__________{}".format(bool(status & 0x10)),
- )
- print(
- "TX FIFO full__________{}e".format("_Tru" if fifo & 0x20 else "Fals"),
- " TX FIFO empty________{}".format(bool(fifo & 0x10)),
- )
- print(
- "RX FIFO full__________{}e".format("_Tru" if fifo & 2 else "Fals"),
- " RX FIFO empty________{}".format(bool(fifo & 1)),
- )
- print(
- "Multicast__________{}ed Custom ACK Payload___{}abled".format(
- "_Allow" if features & 1 else "Disabl",
- "En" if features & 2 else "Dis",
- ),
- )
- print("Dynamic Payloads___{} Auto Acknowledgment__{}".format(dyn_p, auto_ack))
- print(
- "Primary Mode_____________{}X".format("R" if config & 1 else "T"),
- " Power Mode___________{}".format(pwr),
- )
- print("TX address____________ 0x{}".format(address_repr(tx_address)))
- for i in range(6):
- is_open = open_pipes & (1 << i)
- address = pipes[i] if i < 2 else bytes([pipes[i]]) + pipes[1][1:]
- print(
- "Pipe {} ({}) bound: 0x{}".format(
- i, " open " if is_open else "closed", address_repr(address)
- ),
- )
- if is_open and not dyn_pl & (1 << i):
- print("\t\texpecting {} byte static payloads".format(pl_len[i]))
-
-
-# pylint: enable=too-many-locals,too-many-statements
-
-
-def loop():
- """This function is called repeatedly by the App framework."""
- # You can replace this with any code you want your App to run repeatedly.
- time.sleep(10)
-
-
-# See: https://docs.arduino.cc/software/app-lab/tutorials/getting-started/#app-run
-App.run(user_loop=loop)
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.ino b/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.ino
deleted file mode 100644
index 470dc1d..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.ino
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- See documentation at https://nRF24.github.io/RF24
- See License information at root directory of this library
- Authors: Brendan Doherty (2bndy5), Douglas Quigg (dstroy0)
-*/
-
-/**
- A simple example of getting debug info from the nRF24L01 transceiver on the Arduino Q.
-
- This example was written to demonstrate alternative methods to get debugging data.
- 1. radio.encodeRadioDetails() will provide a data dump of all the nRF24L01's registers.
- 2. radio.sprintfPrettyDetails() will behave similarly to printPrettyDetails(), but it
- outputs to a char buffer that can be printed to any Monitor (or other output) stream.
-
- Additionally, this example will show all default configuration values.
-*/
-#include <Arduino_RouterBridge.h>
-#include <SPI.h>
-#include "RF24.h"
-
-#define CE_PIN 7
-#define CSN_PIN 8
-// instantiate an object for the nRF24L01 transceiver
-RF24 radio(CE_PIN, CSN_PIN);
-
-/*
- For this example, we'll be using a data buffer containing
- radio details encoded with RF24::encodeRadioDetails().
- It is meant to be decoded by an external program.
-
- There is a python script located in this example's folder that
- will take a space-delimited string of hexadecimal characters and
- decode then print it out as human readable information.
-*/
-uint8_t encoded_details[43] = {0};
-
-// Use this function to print out the encoded_details as a
-// space-delimited string of hexadecimal characters.
-void dumpRegData()
-{
- for (uint8_t i = 0; i < 43; ++i) {
- Monitor.print(encoded_details[i], HEX);
- if (i < 42)
- Monitor.print(F(" "));
- }
-}
-
-void setup()
-{
- Bridge.begin();
- Monitor.begin();
- delay(3000);
-
- // initialize the transceiver on the SPI bus
- if (!radio.begin()) {
- Monitor.println(F("radio hardware is not responding!!"));
- while (1) {
- } // hold in infinite loop
- }
-
- // print example's introductory prompt
- Monitor.println(F("RF24/examples/encodedRadioDetails"));
-
- Monitor.println(F("Press any key to show debugging information"));
- while (!Monitor.available()) {
- // wait for user input
- }
-
- // For debugging info
- char* debug_info = new char[870];
- uint16_t str_len = radio.sprintfPrettyDetails(debug_info);
- Monitor.println(debug_info);
- Monitor.print(F("\nThe above output used "));
- Monitor.print(str_len);
- Monitor.println(F(" characters."));
-
- // encoded_details is NOT human readable.
- // encodeRadioDetails() is very small when used on its own because it puts debugging information into a byte array
- // No printf() support needed because it doesn't use an output stream.
- radio.encodeRadioDetails(encoded_details);
- Monitor.println(F("\nhexadecimal dump of all registers:"));
- for (int i = 0; i < 43; i++) {
- Bridge.call("RF24Callback", encoded_details[i]);
- }
-
- Monitor.println(F("\n\nThis string of hexadecimal characters (including spaces)."));
- Monitor.print(F("will be transferred to the MPU via the Arduino Q bridge API: "));
- dumpRegData();
-} // setup
-
-/* Registers corresponding to index of encoded_details array
- 0: NRF_CONFIG
- 1: EN_AA
- 2: EN_RXADDR
- 3: SETUP_AW
- 4: SETUP_RETR
- 5: RF_CH
- 6: RF_SETUP
- 7: NRF_STATUS
- 8: OBSERVE_TX
- 9: CD (aka RPD)
- 10-14: RX_ADDR_P0
- 15-19: RX_ADDR_P1
- 20: RX_ADDR_P2
- 21: RX_ADDR_P3
- 22: RX_ADDR_P4
- 23: RX_ADDR_P5
- 24-28: TX_ADDR
- 29: RX_PW_P0
- 30: RX_PW_P1
- 31: RX_PW_P2
- 32: RX_PW_P3
- 33: RX_PW_P4
- 34: RX_PW_P5
- 35: FIFO_STATUS
- 36: DYNPD
- 37: FEATURE
- 38-39: ce_pin
- 40-41: csn_pin
- 42: SPI speed MHz | (isPlusVariant << 4)
-*/
-
-void loop()
-{
- // Nothing to do here. We did it all at the end of setup()
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.yaml b/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.yaml
deleted file mode 100644
index 875c826..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/examples_uno_q/rf24_encoderadiodetails/sketch/sketch.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-profiles:
- default:
- fqbn: arduino:zephyr:unoq
- platforms:
- - platform: arduino:zephyr
- libraries:
- - MsgPack (0.4.2)
- - DebugLog (0.8.4)
- - ArxContainer (0.7.0)
- - ArxTypeTraits (0.3.1)
- - RF24 (1.5.0)
-
-default_profile: default
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_1.png b/.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_1.png
deleted file mode 100644
index 1cdaace..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_1.png
+++ /dev/null
Binary files differ
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_2.png b/.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_2.png
deleted file mode 100644
index 5480898..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/images/ghetto_sheilding_2.png
+++ /dev/null
Binary files differ
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/images/pinout.jpg b/.pio/libdeps/esp32-s3-n16r8/RF24/images/pinout.jpg
deleted file mode 100644
index f83ddb7..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/images/pinout.jpg
+++ /dev/null
Binary files differ
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/library.json b/.pio/libdeps/esp32-s3-n16r8/RF24/library.json
deleted file mode 100644
index c247098..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/library.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "name": "RF24",
- "keywords": "rf, radio, wireless, spi",
- "description": "Radio driver, OSI layer 2 library for nRF24L01(+) transceiver modules.",
- "license": "GPL-2.0-only",
- "repository": {
- "type": "git",
- "url": "https://github.com/nRF24/RF24.git"
- },
- "version": "1.6.0",
- "export": {
- "exclude": [
- "datasheets",
- ".github/*",
- "keywords.txt",
- "configure",
- "examples_pico/*",
- "examples_linux/*",
- "pyRF24/*",
- "cmake/*",
- "CMakeLists.txt",
- "Makefile",
- "utility/CMakeLists.txt",
- "utility/wiringPi/*",
- "utility/MRAA/*",
- "utility/LittleWire/*",
- "utility/RPi/*",
- "utility/SPIDEV/*",
- "utility/rp2/*",
- "utility/ATXMegaD3/*"
- ]
- },
- "frameworks": "arduino",
- "platforms": [
- "atmelavr",
- "atmelsam",
- "teensy",
- "atmelmegaavr",
- "espressif32",
- "espressif8266",
- "ststm32"
- ]
-} \ No newline at end of file
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/library.properties b/.pio/libdeps/esp32-s3-n16r8/RF24/library.properties
deleted file mode 100644
index c462390..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/library.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-name=RF24
-version=1.6.0
-author=TMRh20
-maintainer=TMRh20,Avamander
-sentence=Radio driver, OSI layer 2 library for nrf24L01(+) modules.
-paragraph=Core library for nRF24L01(+) communication. Simple to use for beginners, but offers advanced configuration options. Many examples are included to demonstrate various modes of communication.
-category=Communication
-url=https://nRF24.github.io/RF24/
-architectures=*
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/nRF24L01.h b/.pio/libdeps/esp32-s3-n16r8/RF24/nRF24L01.h
deleted file mode 100644
index 7abde10..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/nRF24L01.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- Copyright (c) 2007 Stefan Engelke <mbox@stefanengelke.de>
- Portions Copyright (C) 2011 Greg Copeland
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use, copy,
- modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef NRF24L01_H_
-#define NRF24L01_H_
-
-#include <stdint.h>
-
-namespace nRF24L01 {
-
-/* Memory Map */
-constexpr uint8_t CONFIG = 0x00;
-constexpr uint8_t EN_AA = 0x01;
-constexpr uint8_t EN_RXADDR = 0x02;
-constexpr uint8_t SETUP_AW = 0x03;
-constexpr uint8_t SETUP_RETR = 0x04;
-constexpr uint8_t RF_CH = 0x05;
-constexpr uint8_t RF_SETUP = 0x06;
-constexpr uint8_t STATUS = 0x07;
-constexpr uint8_t OBSERVE_TX = 0x08;
-constexpr uint8_t CD = 0x09;
-constexpr uint8_t RX_ADDR_P0 = 0x0A;
-constexpr uint8_t RX_ADDR_P1 = 0x0B;
-constexpr uint8_t RX_ADDR_P2 = 0x0C;
-constexpr uint8_t RX_ADDR_P3 = 0x0D;
-constexpr uint8_t RX_ADDR_P4 = 0x0E;
-constexpr uint8_t RX_ADDR_P5 = 0x0F;
-constexpr uint8_t TX_ADDR = 0x10;
-constexpr uint8_t RX_PW_P0 = 0x11;
-constexpr uint8_t RX_PW_P1 = 0x12;
-constexpr uint8_t RX_PW_P2 = 0x13;
-constexpr uint8_t RX_PW_P3 = 0x14;
-constexpr uint8_t RX_PW_P4 = 0x15;
-constexpr uint8_t RX_PW_P5 = 0x16;
-constexpr uint8_t FIFO_STATUS = 0x17;
-constexpr uint8_t DYNPD = 0x1C;
-constexpr uint8_t FEATURE = 0x1D;
-
-/* Bit Mnemonics */
-constexpr uint8_t MASK_RX_DR = 6;
-constexpr uint8_t MASK_TX_DS = 5;
-constexpr uint8_t MASK_MAX_RT = 4;
-constexpr uint8_t EN_CRC = 3;
-constexpr uint8_t CRCO = 2;
-constexpr uint8_t PWR_UP = 1;
-constexpr uint8_t PRIM_RX = 0;
-constexpr uint8_t ENAA_P5 = 5;
-constexpr uint8_t ENAA_P4 = 4;
-constexpr uint8_t ENAA_P3 = 3;
-constexpr uint8_t ENAA_P2 = 2;
-constexpr uint8_t ENAA_P1 = 1;
-constexpr uint8_t ENAA_P0 = 0;
-constexpr uint8_t ERX_P5 = 5;
-constexpr uint8_t ERX_P4 = 4;
-constexpr uint8_t ERX_P3 = 3;
-constexpr uint8_t ERX_P2 = 2;
-constexpr uint8_t ERX_P1 = 1;
-constexpr uint8_t ERX_P0 = 0;
-constexpr uint8_t AW = 0;
-constexpr uint8_t ARD = 4;
-constexpr uint8_t ARC = 0;
-constexpr uint8_t PLL_LOCK = 4;
-constexpr uint8_t CONT_WAVE = 7;
-constexpr uint8_t RF_DR = 3;
-constexpr uint8_t RF_PWR = 6;
-constexpr uint8_t RX_DR = 6;
-constexpr uint8_t TX_DS = 5;
-constexpr uint8_t MAX_RT = 4;
-constexpr uint8_t RX_P_NO = 1;
-constexpr uint8_t TX_FULL = 0;
-constexpr uint8_t PLOS_CNT = 4;
-constexpr uint8_t ARC_CNT = 0;
-constexpr uint8_t TX_REUSE = 6;
-constexpr uint8_t FIFO_FULL = 5;
-constexpr uint8_t TX_EMPTY = 4;
-constexpr uint8_t RX_FULL = 1;
-constexpr uint8_t RX_EMPTY = 0;
-constexpr uint8_t DPL_P5 = 5;
-constexpr uint8_t DPL_P4 = 4;
-constexpr uint8_t DPL_P3 = 3;
-constexpr uint8_t DPL_P2 = 2;
-constexpr uint8_t DPL_P1 = 1;
-constexpr uint8_t DPL_P0 = 0;
-constexpr uint8_t EN_DPL = 2;
-constexpr uint8_t EN_ACK_PAY = 1;
-constexpr uint8_t EN_DYN_ACK = 0;
-
-/* Instruction Mnemonics */
-constexpr uint8_t R_REGISTER = 0x00;
-constexpr uint8_t W_REGISTER = 0x20;
-constexpr uint8_t REGISTER_MASK = 0x1F;
-constexpr uint8_t ACTIVATE = 0x50;
-constexpr uint8_t R_RX_PL_WID = 0x60;
-constexpr uint8_t R_RX_PAYLOAD = 0x61;
-constexpr uint8_t W_TX_PAYLOAD = 0xA0;
-constexpr uint8_t W_ACK_PAYLOAD = 0xA8;
-constexpr uint8_t FLUSH_TX = 0xE1;
-constexpr uint8_t FLUSH_RX = 0xE2;
-constexpr uint8_t REUSE_TX_PL = 0xE3;
-constexpr uint8_t NOP = 0xFF;
-
-/* Non-P omissions */
-constexpr uint8_t LNA_HCURR = 0;
-
-/* P model memory Map */
-constexpr uint8_t RPD = 0x09;
-constexpr uint8_t W_TX_PAYLOAD_NO_ACK = 0xB0;
-
-/* P model bit Mnemonics */
-constexpr uint8_t RF_DR_LOW = 5;
-constexpr uint8_t RF_DR_HIGH = 3;
-constexpr uint8_t RF_PWR_LOW = 1;
-constexpr uint8_t RF_PWR_HIGH = 2;
-
-} // namespace nRF24L01
-
-#endif // NRF24L01_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/nurfile b/.pio/libdeps/esp32-s3-n16r8/RF24/nurfile
deleted file mode 100644
index 72cc78f..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/nurfile
+++ /dev/null
@@ -1,287 +0,0 @@
-
-
-def is-windows [] {
- $nu.os-info | get "family" | str starts-with "windows"
-}
-
-
-def --wrapped run-cmd [...cmd: string] {
- print $"\n(ansi blue)Running(ansi reset) ($cmd | str join ' ')"
- let elapsed = timeit {|| ^($cmd | first) ...($cmd | skip 1)}
- print $"(ansi magenta)($cmd | first) took ($elapsed)(ansi reset)"
-}
-
-
-def flush-artifacts [
- build_dir: string, dirty: bool
-] {
- if ($build_dir | path exists) {
- if $dirty == false {
- print $"(ansi yellow)Removing artifacts(ansi reset) ($build_dir)"
- rm -r $build_dir
- }
- }
-}
-
-
-# Build the docs.
-#
-# Note, there is no check against what
-# version of doxygen is used.
-def "nur docs" [
- --dirty (-d) # Do not flush previous build artifacts
- --open (-o) # Open the built docs in your default browser
-] {
- let build_dir = "docs/html"
- flush-artifacts $build_dir $dirty
- cd docs
- run-cmd doxygen
- if $open {
- let root_pg = $nur.project-path | path join $"($build_dir)/index.html"
- start $root_pg
- }
-}
-
-
-def find-built-examples [path: string] {
- let len = $nur.project-path | str length
- let example_path_len = ($path | str length) + 2
- let sources = (
- glob $"($path)/**/*.cpp" --exclude [
- "**/build/**"
- ]
- | each {$in | str substring ($len + $example_path_len)..-5}
- )
- let binaries = (
- glob $"($path)/build/**/*" --exclude [
- "**/CMakeFiles/**"
- ]
- | each {$in | str substring ($len + $example_path_len + 6)..}
- | filter {$in in $sources}
- )
- $binaries
-}
-
-
-# Build the Linux examples.
-#
-# This task expects the library to be installed.
-# CMake will build any ncurses examples if
-# the libncurses5-dev package is installed
-def "nur examples" [
- --dirty (-d) # Reuse previous build env
- ...cmake_opts: string # additional args passed to cmake when configuring the build env
-] {
- let src_dir = "examples_linux"
- let build_dir = $"($src_dir)/build"
-
- flush-artifacts $build_dir $dirty
-
- if $dirty == false {
- run-cmd cmake -B $build_dir $src_dir ...$cmake_opts
- } else if ($build_dir | path exists) == false {
- run-cmd cmake -B $build_dir $src_dir ...$cmake_opts
- }
- run-cmd cmake --build $build_dir
-
- print $"(ansi green)Built the following examples:(ansi reset)"
- let binaries = (
- find-built-examples $src_dir
- | each {$"($build_dir)/($in)"}
- )
- print $binaries
-}
-
-
-# Build/install the library.
-#
-# Note, this may ask for the password to
-# install the library with super-user privileges.
-def --wrapped "nur lib" [
- --dirty (-d) # Reuse previous build env
- --no-install # Do not install the library (useful for testing compilation)
- ...cmake_opts: string # additional args passed to cmake when configuring the build env
-] {
- let build_dir = "build"
- flush-artifacts $build_dir $dirty
-
- if $dirty == false {
- run-cmd cmake -B build -S . ...$cmake_opts
- }
- run-cmd cmake --build $build_dir
- if $no_install == false {
- run-cmd sudo cmake --install $build_dir
- }
-}
-
-
-# Build the Pico SDK examples.
-#
-# If building on Windows, then `-G Ninja` is
-# automatically passed to CMake when configuring the
-# build environment.
-def --wrapped "nur pico" [
- --dirty (-d) # Reuse previous build env
- ...cmake_opts: string # additional args passed to cmake when configuring the build env
-] {
- let src_dir = "examples_pico"
- let build_dir = $"($src_dir)/build"
- flush-artifacts $build_dir $dirty
-
- let use_ninja = '-G Ninja'
- let opts = if (is-windows) {
- $cmake_opts | append $use_ninja
- } else { $cmake_opts }
-
- if $dirty == false {
- run-cmd cmake -B $build_dir $src_dir ...$opts
- } else if ($build_dir | path exists) == false {
- run-cmd cmake -B $build_dir $src_dir ...$opts
- }
- run-cmd cmake --build $build_dir
-}
-
-
-# Install the python wrapper.
-#
-# Note, this task requires the library
-# (& boost.python) to be installed.
-def "nur py" [
- --dirty (-d) # Reuse previous build env
-] {
- let src_dir = "pyRF24"
- let artifacts = glob $"($src_dir)/{build,*.egg-info}"
- if ($artifacts | length) > 0 {
- if $dirty == false {
- print $"(ansi yellow)Removing artifacts(ansi reset) ($artifacts | str join ' ')"
- rm -r ...$artifacts
- }
- }
- run-cmd pip install -v $"./($src_dir)"
-}
-
-
-def changed-files [] {
- let status = git status --short | lines
- if ($status | length) == 0 {
- print $"(ansi red)No file changes detected via (ansi cyan)`git status`(ansi reset)"
- print $"Perhaps you want to format all files? (ansi cyan)`nur fmt -a`"
- return []
- }
- let changed = (
- $status
- | each {$in | str trim | split column --regex '\s+' -n 2}
- | flatten
- | rename "state" "name"
- )
- # print $changed
- let result = (
- $changed
- | where {$in.state | split chars | each {$in in ['A' 'M' 'R']} | any {$in}}
- | get "name"
- | each {
- if ($in | str contains " -> ") {
- $in | parse "{a} -> {b}" | get "b" | $in.0
- } else { $in }
- }
- )
- # print $result
- $result
-}
-
-
-def get-clang-format-version [bin_name: string] {
- if (which $bin_name | is-empty) {
- null
- } else {
- let version = (
- ^$bin_name --version
- | split column ' '
- | values
- | flatten
- | last
- )
- print $"($bin_name) --version: ($version)"
- $version | parse "{major}.{minor}.{patch}"
- }
-}
-
-
-def match-version [
- bin_name: string,
- expected: string = "14",
- --throw
-] {
- let version = get-clang-format-version $bin_name
- if ($version | is-empty) {
- if $throw {
- error make {
- msg: $"($bin_name) not found. Ensure it is installed and added to your PATH."
- }
- }
- false
- } else {
- if ($version.major.0 == $expected) {
- true
- } else if $throw {
- error make {
- msg: $"Failed to find clang-format v($expected).x"
- }
- } else {
- false
- }
- }
-}
-
-
-# Run clang-format on C++ files.
-#
-# By default, only changed C++ sources are formatted (uses `git status`).
-# The clang-format version is expected to be v14.
-# If v14 is not found, then an error is thrown.
-def "nur fmt" [
- --all (-a) # Format all C++ sources
-] {
- let all_files = glob "**/*.{h,cpp,c,ino}" --exclude [
- "**/build/**"
- "utility/RPi/bcm2835.*"
- "examples/old_backups/**"
- "examples_linux/{interrupts,extra}/*"
- ] | path relative-to $nur.project-path
- let files = if $all {
- $all_files
- } else {
- let changes = changed-files
- (
- $all_files
- | where {
- ($in | path split) in (
- $changes | each {$in | path split}
- )
- }
- )
- }
-
- let bin_name = if (is-windows) {
- let bin_name = "clang-format"
- let is_expected = match-version $bin_name --throw
- "clang-format"
- } else {
- let bin_name = "clang-format-14"
- let is_expected = match-version $bin_name
- if ($is_expected == false) {
- let bin_name = "clang-format"
- let is_expected = match-version $bin_name --throw
- $bin_name
- } else {
- $bin_name
- }
- }
-
- if ($files | length) > 0 {
- print $files
- let elapsed = timeit {|| $files | par-each {|f| ^$bin_name "-i" "--style" "file" $f}}
- print $"clang-format took ($elapsed) using parallelism!"
- }
- print $"(ansi blue)Applied clang-format to ($files | length) files(ansi reset)"
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/printf.h b/.pio/libdeps/esp32-s3-n16r8/RF24/printf.h
deleted file mode 100644
index df06c52..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/printf.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
- */
-/* Galileo support from spaniakos <spaniakos@gmail.com> */
-
-/**
- * @file printf.h
- *
- * Setup necessary to direct stdout to the Arduino Serial library, which
- * enables 'printf'
- */
-
-#ifndef RF24_PRINTF_H_
-#define RF24_PRINTF_H_
-
-#if defined(ARDUINO_ARCH_AVR) || defined(__ARDUINO_X86__) || defined(ARDUINO_ARCH_MEGAAVR)
-
-int serial_putc(char c, FILE*)
-{
- Serial.write(c);
- return c;
-}
-
-#elif defined(ARDUINO_ARCH_MBED)
-REDIRECT_STDOUT_TO(Serial);
-
-#endif // defined (ARDUINO_ARCH_AVR) || defined (__ARDUINO_X86__) || defined (ARDUINO_ARCH_MBED) || defined (ARDUINO_ARCH_MEGAAVR)
-
-void printf_begin(void)
-{
-#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
- fdevopen(&serial_putc, 0);
-
-#elif defined(__ARDUINO_X86__)
- // For redirect stdout to /dev/ttyGS0 (Serial Monitor port)
- stdout = freopen("/dev/ttyGS0", "w", stdout);
- delay(500);
- printf("Redirecting to Serial...");
-#endif // defined(__ARDUINO_X86__)
-}
-
-#endif // RF24_PRINTF_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/ATTiny/RF24_arch_config.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/ATTiny/RF24_arch_config.h
deleted file mode 100644
index 40e5399..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/ATTiny/RF24_arch_config.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- TMRh20 2015
- ATTiny Configuration File
-*/
-
-#ifndef RF24_UTILITY_ATTINY_RF24_ARCH_CONFIG_H_
-#define RF24_UTILITY_ATTINY_RF24_ARCH_CONFIG_H_
-
-/*** USER DEFINES: ***/
-//#define FAILURE_HANDLING
-//#define MINIMAL
-/**********************/
-
-#define rf24_max(a, b) (a > b ? a : b)
-#define rf24_min(a, b) (a < b ? a : b)
-
-#if ARDUINO < 100
- #include <WProgram.h>
-#else
- #include <Arduino.h>
-#endif
-
-#include <stddef.h>
-
-#include <SPI.h>
-
-#define _SPI SPI
-typedef uint8_t rf24_gpio_pin_t;
-#define RF24_PIN_INVALID 0xFF
-
-#if !defined(RF24_CSN_SETTLE_LOW_DELAY)
- #define RF24_CSN_SETTLE_LOW_DELAY 11
-#endif
-
-#if !defined(RF24_CSN_SETTLE_HIGH_DELAY)
- #define RF24_CSN_SETTLE_HIGH_DELAY 100
-#endif
-
-#ifdef RF24_DEBUG
- #define IF_RF24_DEBUG(x) ({ x; })
-#else
- #define IF_RF24_DEBUG(x)
-
- #if defined(RF24_TINY)
- #define printf_P(...)
- #endif
-#endif // !defined(RF24_DEBUG)
-
-#include <avr/pgmspace.h>
-
-#define PRIPSTR "%S"
-
-#endif // RF24_UTILITY_ATTINY_RF24_ARCH_CONFIG_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Teensy/RF24_arch_config.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Teensy/RF24_arch_config.h
deleted file mode 100644
index 6e4a836..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Teensy/RF24_arch_config.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef RF24_UTILITY_TEENSY_RF24_ARCH_CONFIG_H_
-#define RF24_UTILITY_TEENSY_RF24_ARCH_CONFIG_H_
-#if ARDUINO < 100
-
- #include <WProgram.h>
-
-#else
- #include <Arduino.h>
-#endif
-
-#include <stddef.h>
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <SPI.h>
-
-#define _SPI SPIClass
-#define RF24_SPI_PTR
-typedef uint8_t rf24_gpio_pin_t;
-#define RF24_PIN_INVALID 0xFF
-
-#define printf Serial.printf
-
-#ifdef RF24_DEBUG
- #define IF_RF24_DEBUG(x) ({ x; })
-#else
- #define IF_RF24_DEBUG(x)
-#endif
-
-#define PRIPSTR "%s"
-
-#endif // RF24_UTILITY_TEENSY_RF24_ARCH_CONFIG_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/RF24_arch_config.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/RF24_arch_config.h
deleted file mode 100644
index 2cfd75a..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/RF24_arch_config.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- */
-
-/**
- * @file RF24_arch_config.h
- * General defines and includes for RF24/Linux
- */
-
-/**
- * Example of RF24_arch_config.h for RF24 portability
- *
- * @defgroup Porting_General Porting: General
- * @{
- */
-
-#ifndef RF24_UTILITY_TEMPLATE_RF24_ARCH_CONFIG_H_
-#define RF24_UTILITY_TEMPLATE_RF24_ARCH_CONFIG_H_
-
-#define RF24_LINUX
-
-#include <stddef.h>
-#include "spi.h"
-#include "gpio.h"
-#include "compatibility.h"
-#include <stdint.h>
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-#include <sys/time.h>
-
-#define _BV(x) (1 << (x))
-#define _SPI spi
-
-#ifdef RF24_DEBUG
- #define IF_RF24_DEBUG(x) ({ x; })
-#else
- #define IF_RF24_DEBUG(x)
-#endif
-
-// Avoid spurious warnings
-#if !defined(NATIVE) && defined(ARDUINO)
- #undef PROGMEM
- #define PROGMEM __attribute__((section(".progmem.data")))
- #undef PSTR
- #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0]; }))
-#endif
-
-typedef uint16_t prog_uint16_t;
-typedef uint16_t rf24_gpio_pin_t;
-#define PSTR(x) (x)
-#define printf_P printf
-#define strlen_P strlen
-#define PROGMEM
-#define pgm_read_word(p) (*(const unsigned short*)(p))
-#define PRIPSTR "%s"
-#define pgm_read_byte(p) (*(const unsigned char*)(p))
-
-// Function, constant map as a result of migrating from Arduino
-#define LOW GPIO::OUTPUT_LOW
-#define HIGH GPIO::OUTPUT_HIGH
-#define INPUT GPIO::DIRECTION_IN
-#define OUTPUT GPIO::DIRECTION_OUT
-#define digitalWrite(pin, value) GPIO::write(pin, value)
-#define pinMode(pin, direction) GPIO::open(pin, direction)
-#define delay(millisec) __msleep(millisec)
-#define delayMicroseconds(usec) __usleep(usec)
-#define millis() __millis()
-
-/**@}*/
-
-#endif // RF24_UTILITY_TEMPLATE_RF24_ARCH_CONFIG_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/compatibility.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/compatibility.h
deleted file mode 100644
index 49c33e1..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/compatibility.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @file compatibility.h
- * Class declaration for SPI helper files
- */
-
-/**
- * Example of compatibility.h class declaration for timing functions portability
- *
- * @defgroup Porting_Timing Porting: Timing
- * @{
- */
-
-#ifndef RF24_UTILITY_TEMPLATE_COMPATIBLITY_H_
-#define RF24_UTILITY_TEMPLATE_COMPATIBLITY_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-
-void __msleep(int millisec);
-
-void __usleep(int microsec);
-
-void __start_timer();
-
-uint32_t __millis();
-
-#ifdef __cplusplus
-}
-#endif
-
-/**@}*/
-
-#endif // RF24_UTILITY_TEMPLATE_COMPATIBLITY_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/gpio.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/gpio.h
deleted file mode 100644
index 9164646..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/gpio.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * @file gpio.h
- * Class declaration for SPI helper files
- */
-
-/**
- * Example of gpio.h class declaration for GPIO portability
- *
- * @defgroup Porting_GPIO Porting: GPIO
- * @{
- */
-#ifndef RF24_UTILITY_TEMPLATE_GPIO_H_
-#define RF24_UTILITY_TEMPLATE_GPIO_H_
-
-#include <cstdio>
-
-#ifndef DOXYGEN_FORCED
-// exclude this line from the docs to prevent displaying in the list of classes
-class GPIO
-#endif
-{
-
-public:
- /* Constants */
- static const int DIRECTION_OUT = 1;
- static const int DIRECTION_IN = 0;
-
- static const int OUTPUT_HIGH = 1;
- static const int OUTPUT_LOW = 0;
-
- GPIO();
-
- /**
- * Similar to Arduino pinMode(pin,mode);
- * @param port
- * @param DDR
- */
- static void open(int port, int DDR);
-
- /**
- *
- * @param port
- */
- static void close(int port);
-
- /**
- * Similar to Arduino digitalRead(pin);
- * @param port
- */
- static int read(int port);
-
- /**
- * Similar to Arduino digitalWrite(pin,state);
- * @param port
- * @param value
- */
- static void write(int port, int value);
-
-#ifndef DOXYGEN_FORCED
- // exclude this line from the docs to prevent warnings docs generators
- virtual ~GPIO();
-#endif
-};
-
-/**@}*/
-
-#endif // RF24_UTILITY_TEMPLATE_GPIO_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/includes.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/includes.h
deleted file mode 100644
index 2dd2412..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/includes.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * @file includes.h
- * Configuration defines for RF24/Linux
- */
-
-/**
- * Example of includes.h for RF24 Linux portability
- *
- * @defgroup Porting_Includes Porting: Includes
- * @{
- */
-
-#ifndef RF24_UTILITY_INCLUDES_H_
-#define RF24_UTILITY_INCLUDES_H_
-
-/**
- * Define a specific platform for this configuration
- */
-#define RF24_TEMPLATE
-
-/**
- * Load the correct configuration for this platform
- */
-#include "Template/RF24_arch_config.h"
-
-/**@}*/
-
-#endif // RF24_UTILITY_INCLUDES_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/spi.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/spi.h
deleted file mode 100644
index c4432a3..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/Template/spi.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * @file spi.h
- * Class declaration for SPI helper files
- */
-
-/**
- * Example of spi.h class declaration for SPI portability
- *
- * @defgroup Porting_SPI Porting: SPI
- * @{
- */
-#ifndef RF24_UTILITY_TEMPLATE_SPI_H_
-#define RF24_UTILITY_TEMPLATE_SPI_H_
-
-#include <stdint.h>
-
-#ifndef DOXYGEN_FORCED
-// exclude this line from the docs to prevent displaying in the list of classes
-class SPI
-#endif
-{
-
-public:
- /**
- * SPI constructor
- */
- SPI();
-
- /**
- * Start SPI
- */
- void begin(int busNo);
-
- /**
- * Transfer a single byte
- * @param tx_ Byte to send
- * @return Data returned via spi
- */
- uint8_t transfer(uint8_t tx_);
-
- /**
- * Transfer a buffer of data
- * @param txBuf Transmit buffer
- * @param rxBuf Receive buffer
- * @param len Length of the data
- */
- void transfernb(char* txBuf, char* rxBuf, uint32_t len);
-
- /**
- * Transfer a buffer of data without an rx buffer
- * @param buf Pointer to a buffer of data
- * @param len Length of the data
- */
- void transfern(char* buf, uint32_t len);
-
-#ifndef DOXYGEN_FORCED
- // exclude this line from the docs to prevent warnings docs generators
- virtual ~SPI();
-#endif
-
-private:
- /** SPI bus */
- int bus;
- /** SPI Mode set */
- uint8_t mode;
- /** SPI word size */
- uint8_t bits;
- /** SPI speed */
- uint32_t speed;
-};
-
-/**@}*/
-
-#endif // RF24_UTILITY_TEMPLATE_SPI_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/RF24_arch_config.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/RF24_arch_config.h
deleted file mode 100644
index 3d05c09..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/RF24_arch_config.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-
- */
-#ifndef RF24_UTILITY_PIGPIO_RF24_ARCH_CONFIG_H_
-#define RF24_UTILITY_PIGPIO_RF24_ARCH_CONFIG_H_
-
-#define RF24_LINUX
-
-#include <stdint.h> // uint16_t
-#include <stdio.h> // printf
-#include <string.h> // strlen
-#include "spi.h"
-#include "gpio.h"
-#include "compatibility.h"
-
-//#define RF24_SPI_SPEED RF24_SPIDEV_SPEED
-
-#define _BV(x) (1 << (x))
-#define _SPI spi
-
-#ifdef RF24_DEBUG
- #define IF_RF24_DEBUG(x) ({ x; })
-#else
- #define IF_RF24_DEBUG(x)
-#endif
-
-// Avoid spurious warnings
-#if 1
- #if !defined(NATIVE) && defined(ARDUINO)
- #undef PROGMEM
- #define PROGMEM __attribute__((section(".progmem.data")))
- #undef PSTR
- #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0]; }))
- #endif
-#endif
-
-#if RF24_SPI_SPEED > 1000000
- #undef RF24_SPI_SPEED
- #define RF24_SPI_SPEED 1000000
-#endif
-
-typedef uint16_t prog_uint16_t;
-typedef uint8_t rf24_gpio_pin_t;
-#define RF24_PIN_INVALID 0xFF
-
-#define PSTR(x) (x)
-#define printf_P printf
-#define strlen_P strlen
-#define PROGMEM
-#define pgm_read_word(p) (*(const unsigned short*)(p))
-#define PRIPSTR "%s"
-#define pgm_read_byte(p) (*(const unsigned char*)(p))
-#define pgm_read_ptr(p) (*(void* const*)(p))
-
-// Function, constant map as a result of migrating from Arduino
-#define LOW GPIO::OUTPUT_LOW
-#define HIGH GPIO::OUTPUT_HIGH
-#define INPUT GPIO::DIRECTION_IN
-#define OUTPUT GPIO::DIRECTION_OUT
-#define digitalWrite(pin, value) GPIO::write(pin, value)
-#define pinMode(pin, direction) GPIO::open(pin, direction)
-#define delay(millisec) __msleep(millisec)
-#define delayMicroseconds(usec) __usleep(usec)
-#define millis() __millis()
-
-#endif // RF24_UTILITY_PIGPIO_RF24_ARCH_CONFIG_H_
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.cpp b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.cpp
deleted file mode 100644
index f28cf3d..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <time.h>
-#include <chrono>
-#include "compatibility.h"
-
-long long mtime, seconds, useconds;
-//static struct timeval start, end;
-//struct timespec start, end;
-
-void __msleep(int millisec)
-{
- struct timespec req; // = {0};
- req.tv_sec = (time_t)millisec / 1000;
- req.tv_nsec = (millisec % 1000) * 1000000L;
- //nanosleep(&req, (struct timespec *)NULL);
- clock_nanosleep(CLOCK_REALTIME, 0, &req, NULL);
-}
-
-void __usleep(int microsec)
-{
- struct timespec req; // = {0};
- req.tv_sec = (time_t)microsec / 1000000;
- req.tv_nsec = (microsec % 1000000) * 1000;
- //nanosleep(&req, (struct timespec *)NULL);
- clock_nanosleep(CLOCK_REALTIME, 0, &req, NULL);
-}
-
-/**
- * This function is added in order to simulate arduino millis() function
- */
-
-bool timerStarted = false;
-
-void __start_timer()
-{
-}
-
-auto start = std::chrono::steady_clock::now();
-
-uint32_t __millis()
-{
-
- auto end = std::chrono::steady_clock::now();
-
- return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.h
deleted file mode 100644
index b94c571..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/compatibility.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Time keeping functions
- */
-#ifndef RF24_UTILITY_PIGPIO_COMPATIBLITY_H_
-#define RF24_UTILITY_PIGPIO_COMPATIBLITY_H_
-
-#include <stdint.h> // for uintXX_t types
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void __msleep(int millisec);
-
-void __usleep(int microsec);
-
-void __start_timer();
-
-uint32_t __millis();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* RF24_UTILITY_PIGPIO_COMPATIBLITY_H_ */
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.cpp b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.cpp
deleted file mode 100644
index 3c9a63e..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * GPIO Functions
- */
-#include <pigpio.h>
-#include "gpio.h"
-
-bool initialized = 0;
-
-GPIO::GPIO()
-{
-}
-
-GPIO::~GPIO()
-{
- gpioTerminate();
-}
-
-void GPIO::open(int port, int DDR)
-{
- if (!initialized) {
- gpioInitialise();
- }
- initialized = true;
- gpioSetMode(port, PI_OUTPUT);
-}
-
-void GPIO::close(int port)
-{
-}
-
-int GPIO::read(int port)
-{
- return gpioRead(port);
-}
-
-void GPIO::write(int port, int value)
-{
- gpioWrite(port, value);
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.h
deleted file mode 100644
index 8fe245c..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/gpio.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- */
-
-#ifndef RF24_UTILITY_PIGPIO_GPIO_H_
-#define RF24_UTILITY_PIGPIO_GPIO_H_
-
-#include <stdexcept>
-
-/** Specific exception for GPIO errors */
-class GPIOException : public std::runtime_error
-{
-public:
- explicit GPIOException(const std::string& msg)
- : std::runtime_error(msg)
- {
- }
-};
-
-class GPIO
-{
-public:
- /* Constants */
- static const int DIRECTION_OUT = 1;
- static const int DIRECTION_IN = 0;
-
- static const int OUTPUT_HIGH = 1;
- static const int OUTPUT_LOW = 0;
-
- GPIO();
-
- /**
- * Similar to Arduino pinMode(pin,mode);
- * @param port
- * @param DDR
- */
- static void open(int port, int DDR);
-
- /**
- *
- * @param port
- */
- static void close(int port);
-
- /**
- * Similar to Arduino digitalRead(pin);
- * @param port
- */
- static int read(int port);
-
- /**
- * Similar to Arduino digitalWrite(pin,state);
- * @param port
- * @param value
- */
- static void write(int port, int value);
-
- virtual ~GPIO();
-
-private:
-};
-
-#endif /* RF24_UTILITY_PIGPIO_GPIO_H_ */
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/includes.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/includes.h
deleted file mode 100644
index 9f4c2e8..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/includes.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef RF24_UTILITY_INCLUDES_H_
-#define RF24_UTILITY_INCLUDES_H_
-
-#define RF24_PIGPIO
-
-#include <cstring> // memcpy() used in RF24.cpp
-#include "pigpio/RF24_arch_config.h"
-#include "pigpio/interrupt.h"
-
-#endif
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.cpp b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.cpp
deleted file mode 100644
index ad89af4..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Interrupt implementation wrapped from pigpio library
- */
-#include <pigpio.h>
-#include "interrupt.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int attachInterrupt(int pin, int mode, void (*function)(void))
-{
- gpioInitialise();
- return gpioSetISRFunc(pin, mode, 0, (gpioISRFunc_t)function);
-}
-
-int detachInterrupt(int pin)
-{
- return gpioSetISRFunc(pin, 0, 0, NULL);
-}
-
-void rfNoInterrupts()
-{
-}
-
-void rfInterrupts()
-{
-}
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.h
deleted file mode 100644
index 80272cd..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/interrupt.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Interrupt functions wrapped from pigpio library
- */
-#ifndef RF24_UTILITY_PIGPIO_INTERRUPT_H_
-#define RF24_UTILITY_PIGPIO_INTERRUPT_H_
-
-#include <pigpio.h>
-
-#define INT_EDGE_FALLING FALLING_EDGE
-#define INT_EDGE_RISING RISING_EDGE
-#define INT_EDGE_BOTH EITHER_EDGE
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int attachInterrupt(int pin, int mode, void (*function)(void));
-
-int detachInterrupt(int pin);
-
-/* Deprecated, no longer functional */
-void rfNoInterrupts();
-
-/* Deprecated, no longer functional */
-void rfInterrupts();
-
-#ifdef __cplusplus
-}
-#endif
-#endif // RF24_UTILITY_PIGPIO_INTERRUPT_H_ \ No newline at end of file
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.cpp b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.cpp
deleted file mode 100644
index 8698a14..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- */
-
-#include <pigpio.h>
-#include "spi.h"
-
-SPI::SPI()
-{
-}
-
-void SPI::begin(int busNo, uint32_t spi_speed)
-{
- if (this->spiIsInitialized) {
- return;
- }
- spiIsInitialized = true;
- gpioInitialise();
- spiHandle = spiOpen((unsigned int)(busNo & 2), spi_speed, (unsigned int)((busNo / 10) << 7));
-}
-
-void SPI::init(uint32_t speed)
-{
-}
-
-uint8_t SPI::transfer(char tx)
-{
- char rbuf = 0;
- spiXfer(spiHandle, &tx, &rbuf, 1);
- return rbuf;
-}
-
-void SPI::transfernb(char* txBuf, char* rxBuf, uint32_t len)
-{
- spiXfer(spiHandle, txBuf, rxBuf, len);
-}
-
-SPI::~SPI()
-{
-}
diff --git a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.h b/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.h
deleted file mode 100644
index 9c5fa2a..0000000
--- a/.pio/libdeps/esp32-s3-n16r8/RF24/utility/pigpio/spi.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *
- */
-
-#ifndef RF24_UTILITY_PIGPIO_SPI_H_
-#define RF24_UTILITY_PIGPIO_SPI_H_
-
-#include <cstdint>
-#include <stdexcept>
-
-/** Specific exception for SPI errors */
-class SPIException : public std::runtime_error
-{
-public:
- explicit SPIException(const std::string& msg)
- : std::runtime_error(msg)
- {
- }
-};
-
-class SPI
-{
-
-public:
- /**
- * SPI constructor
- */
- SPI();
-
- /**
- * Start SPI
- */
- void begin(int busNo, uint32_t spi_speed);
-
- /**
- * Transfer a single byte
- * @param tx Byte to send
- * @return Data returned via spi
- */
- uint8_t transfer(char tx);
-
- /**
- * Transfer a buffer of data
- * @param txBuf Transmit buffer
- * @param rxBuf Receive buffer
- * @param len Length of the data
- */
- void transfernb(char* txBuf, char* rxBuf, uint32_t len);
-
- /**
- * Transfer a buffer of data without an rx buffer
- * @param buf Pointer to a buffer of data
- * @param len Length of the data
- */
- void transfern(char* buf, uint32_t len)
- {
- transfernb(buf, buf, len);
- }
-
- ~SPI();
-
-private:
- unsigned spiHandle;
- bool spiIsInitialized = false;
- void init(uint32_t spi_speed);
-};
-
-#endif /* RF24_UTILITY_PIGPIO_SPI_H_ */