-
Notifications
You must be signed in to change notification settings - Fork 63
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
added NodeCapabilities message #4
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
# NodeCapabilities messages | ||
|
||
# this message contains information about the capabilities of the node sending the messgage, | ||
# or if the authoritative flag is set, then it announces the mininum capabilities of all nodes on the bus | ||
|
||
# a node should not activate a capability until it has seen an | ||
# authoritative announcement that the mininum capability on the bus | ||
# includes the corresponding capability. For example, if a node is | ||
# capable of doing 8MBit FDCAN then it should set the | ||
# FLAG_FDCAN_4M_SUPPORT in its announcements, but not start using 4M | ||
# FDCAN until it has seen an authoritative message with the | ||
# FLAG_FDCAN_4M_SUPPORT bit set in flags. | ||
|
||
# on receipt of this message all nodes should set their active | ||
# capabilities to the minimum of the received message capabilities and | ||
# their current capabilities. For example, this means if a node is | ||
# currently using FDCAN 4M and it sees a packet (whether authoritative | ||
# or not) without the FDCAN 4M flag set then it should stop using | ||
# FDCAN and fall back to the next lowest level (in the case of 4M | ||
# FDCAN this would be 1M bxCAN) | ||
|
||
# the central server (usually the DNA server) collates the | ||
# capabilities of all nodes on the bus and is responsible for | ||
# announcing the minimum capabilities with the authoritative flag | ||
# set. The central server will also send an announcement with its own | ||
# capabilities, which may be higher than the minimum on the bus. This | ||
# announcement of its own capabilities should not have the | ||
# authoritative flag set. | ||
|
||
# the central server may have a (possibibly configurable) delay | ||
# between when an increase in minimum network capability happens and | ||
# when it announces the upgraded capability. A delay on startup is a | ||
# good idea to allow time for legacy nodes to startup | ||
|
||
uint32 FLAG_AUTHORITATIVE = 1 | ||
# the PUBLISHER_ONLY bit should be set if this node only publishes data, most sensor | ||
# nodes should set this bit | ||
uint32 FLAG_PUBLISHER_ONLY = 2 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What's the purpose of FLAG_PUBLISHER_ONLY? Does it mean literally only publishes and doesn't subscribe to anything or is there some nuance (parameters, etc)? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the idea is to distinguish between a node publishing sensor data and nodes that consume sensor data. The reason this matters is for thinks like the old GNSS Fix message. We'd like to stop sending that message to save bandwidth, but we can't do that unless we know that all nodes that consume GNSS messages understand Fix2. We don't care if (for example) a baro/compass sensor node is at the level that understands Fix2, as it doesn't consume any GNSS messages, but we do care if all the consumer nodes (flight controllers, loggers, cameras etc) understand Fix2. |
||
uint32 FLAG_FDCAN_4M_SUPPORT = 4 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you seeing 4Mbit as a natural boundary somewhere? I'm seeing a lot of parts capable of 2M and 5M, but it's not like I've done a survey. Another idea could be to separate the CAN version (2.0B, CAN FD 1.0, maybe CAN XL later) and the max bit rate? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @bugobliterator what do you think? should we support 5M? I think keeping the number of options small is good There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. discussed with @bugobliterator, we think we should do 2M, 5M and 8M, with arbitration at 1M for all 3 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. what about 2M, 5M? 8M is not common and requires special SIC transceivers to utilize this datarate. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing BRS support. CAN-FD can be used without setting the BRS or having a different data rate. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. that is a question for @bugobliterator There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wouldn't lack of BRS support be implicit in the bitrate flags with the supported bitrate being limited to 1M (FLAG_FDCAN_1M_SUPPORT)? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After some discussions on Discord (my kids are laughing at me for using Discord BTW. Thanks for that) I think the best design here is to define a set of abstract, Level-1 standards and given them names. For example:
where each is defined with a separate specification for your L1 bus. This would include all of the considerations like arbitration rate, data rate, sample point, etc. My example here would optimize these settings for:
That said, it may introduce some complexity into firmwares to require runtime reconfiguration to a minimum supported standard. You might allow this process to simply report to the user that "node x is not compatible with this system" and provide a link to the manufacturer's reported help URL. That URL can then instruct the user on how to reconfigure the LRU into one of the four modes. This suggests you need a "can dynamically reconfigure" flag in the message. |
||
uint32 FLAG_FDCAN_8M_SUPPORT = 8 | ||
uint32 FLAG_TAO_DISABLE_SUPPORT = 16 | ||
uint32 flags | ||
|
||
# the dronecan_messaging_level and dronecan_publisher_messaging_level | ||
# fields gives information on what DroneCAN messages are supported by | ||
# the node making the announcement, or in the case of the central | ||
# server, the minimum levels across the whole bus. | ||
|
||
# Messaging levels are: | ||
|
||
# Level1: supports Fix2 GNSS message | ||
# if all nodes that are not publisher-only support this level then | ||
# GNSS nodes can choose to not send older GNSS Fix messages | ||
|
||
uint16 DRONECAN_LEVEL_LEGACY = 0 | ||
uint16 DRONECAN_LEVEL_LEVEL1 = 1 | ||
|
||
uint16 dronecan_messaging_level | ||
uint16 dronecan_publisher_messaging_level |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's not clear when nodes, other than the central server, should emit this message. Also, as a protocol, there's no discussion of what to do if more than one nodeID sends different capabilities with the authoritative bit set.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
different capabilities with authoritative set would have to be either a transient condition or a bug in the implementation. All the authoritative servers have the same information to work with so should come to the same result
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think logging an error in the authoritative server if it sees persistent (more than 5s?) conflicting information would be the way to go