Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Espnow Support #663

Merged
merged 3 commits into from
Nov 3, 2024
Merged

Espnow Support #663

merged 3 commits into from
Nov 3, 2024

Conversation

davepl
Copy link
Contributor

@davepl davepl commented Nov 2, 2024

This adds ESPNOW support so that an ESPNOW client device can connect and do things like change the current effect. Note that it seems not to be compatible with WiFi use, so you get one or the other.

  • I read the contribution guidelines in CONTRIBUTING.md.
  • I understand the BlinkenPerBit metric, and maximized it in this PR.
  • I selected main as the target branch.
  • All code herein is subjected to the license terms in COPYING.txt.


void onReceiveESPNOW(const uint8_t *macAddr, const uint8_t *data, int dataLen)
{
memcpy(&message, data, sizeof(message));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this copy necessary at all? Why is message a global at all?
If so, should it be after the packet is validated, no?

If all you're doign is peeking at the command member of data, just cast it and use it in place after verifying the cbSize is appropriate.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depends how async the code is. Am I guaranteed that a second message won't come in in the meantime and corrupt the first? I assume so, but copying seemed safer, and it's nominally 6 bytes, so...

@@ -569,7 +583,7 @@ void loop()
String strOutput;

#if ENABLE_WIFI
strOutput += str_sprintf("WiFi: %s, IP: %s, ", WLtoString(WiFi.status()), WiFi.localIP().toString().c_str());
strOutput += str_sprintf("WiFi: %s, MAC: %s, IP: %s ", WLtoString(WiFi.status()), WiFi.macAddress().c_str(), WiFi.localIP().toString().c_str());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cat this be in the stgartup prose instead of in the .5hz loop?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, we show WiFi status every 5 seconds, if WiFi is enabled. This is based on the fact that connectivity might drop, addresses can change, etc. This decision was made after multiple sessions of hair-pulling over networking stuff being not working stuff.

@rbergen
Copy link
Collaborator

rbergen commented Nov 3, 2024

@davepl I noticed you opened two PRs to add ESPNOW support: #663 (this one) straight from the espnow feature branch in your fork, and #664 from main in your fork.

I assume you meant to open the first to merge espnow into your fork's main, but opening a PR on the main tree straight from a feature branch in a fork is a totally valid approach, and actually the "cleanest" from a commit history perspective - so actually "mildly preferred".

As @robertlipe has already left some comments on this PR (663) as well, I'll proceed with reviewing and eventually merging this PR. I'll close #664 as a duplicate.

@rbergen rbergen mentioned this pull request Nov 3, 2024
4 tasks
Copy link
Collaborator

@rbergen rbergen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I personally have one small comment change suggestion for clarity. LGTM otherwise.

include/globals.h Show resolved Hide resolved
@@ -569,7 +583,7 @@ void loop()
String strOutput;

#if ENABLE_WIFI
strOutput += str_sprintf("WiFi: %s, IP: %s, ", WLtoString(WiFi.status()), WiFi.localIP().toString().c_str());
strOutput += str_sprintf("WiFi: %s, MAC: %s, IP: %s ", WLtoString(WiFi.status()), WiFi.macAddress().c_str(), WiFi.localIP().toString().c_str());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, we show WiFi status every 5 seconds, if WiFi is enabled. This is based on the fact that connectivity might drop, addresses can change, etc. This decision was made after multiple sessions of hair-pulling over networking stuff being not working stuff.

g_ptrSystem->EffectManager().PreviousEffect();
break;

case ESPNowCommand::ESPNOW_SETEFFECT:
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not doing any argument validation here because I assume (and have confirmed) that the APIs themselves do the sanity checks, so don't want a separate layer of logic if I can avoid it.

@rbergen rbergen merged commit 352ac6b into PlummersSoftwareLLC:main Nov 3, 2024
42 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants