Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
openlcb::SimpleCanStack Class Reference

Helper class for bringing up all components needed for a typical OpenLCB node. More...

#include <SimpleStack.hxx>

Inheritance diagram for openlcb::SimpleCanStack:
openlcb::SimpleCanStackBase openlcb::SimpleStackBase

Public Member Functions

 SimpleCanStack (const openlcb::NodeID node_id)
 
Nodenode () override
 
- Public Member Functions inherited from openlcb::SimpleCanStackBase
 SimpleCanStackBase (const openlcb::NodeID node_id)
 
CanHubFlowcan_hub ()
 
void add_can_port_blocking (const char *device)
 Adds a CAN bus port with synchronous driver API.
 
void add_gridconnect_port (const char *path, Notifiable *on_exit=nullptr)
 Adds a gridconnect port to the CAN bus.
 
void start_tcp_hub_server (int port=12021)
 Starts a TCP server on the specified port in listening mode.
 
GcTcpHubget_tcp_hub_server ()
 Retrieve the instance of the GridConnect Hub server, which was started with start_tcp_hub_server().
 
void shutdown_tcp_hub_server ()
 Shuts down the GridConnect Hub server, if previously started.
 
void connect_tcp_gridconnect_hub (const char *host, int port)
 Connects to a CAN hub using TCP with the gridconnect protocol.
 
void print_all_packets (bool timestamped=false)
 Causes all CAN packets to be printed to stdout.
 
HubFlowgridconnect_hub ()
 Returns the hub to be used for gridconnect-format CANbus.
 
IfCanif_can ()
 
void add_stream_support ()
 Enables stream transport in the interface and in the memory config protocol.
 
- Public Member Functions inherited from openlcb::SimpleStackBase
 SimpleStackBase (std::function< std::unique_ptr< PhysicalIf >()> create_if_helper)
 
Executor< EXECUTOR_PRIORITIES > * executor ()
 
Serviceservice ()
 
Ififace ()
 
DatagramServicedg_service ()
 
SimpleInfoFlowinfo_flow ()
 Accessor for clients that have their custom SNIP-like handler.
 
MemoryConfigHandlermemory_config_handler ()
 
ConfigUpdateServiceconfig_service ()
 
void set_tx_activity_led (const Gpio *led, long long period=MSEC_TO_NSEC(33))
 Adds an activiy LED which will be flashed every time a message is sent from this node to the network.
 
void restart_stack ()
 Reinitializes the node.
 
void loop_executor (bool delay_start=false)
 Donates the current thread to the executor.
 
void start_after_delay ()
 Call this function when you used delay_start upon starting the executor.
 
void start_executor_thread (const char *name, int priority, size_t stack_size, bool delay_start=false)
 Instructs the executor to create a new thread and run in there.
 
int create_config_file_if_needed (const InternalConfigData &ofs, uint16_t expected_version, unsigned file_size)
 Tries to open the config file; if not existant, the size too small, or the version number is mismatched, then creates a new file of the given size with all 0xFF bytes inside.
 
int check_version_and_factory_reset (const InternalConfigData &ofs, uint16_t expected_version, bool force=false)
 Checks the version information in the EEPROM and performs a factory reset if incorrect or if force is set.
 
void send_event (uint64_t event_id)
 Helper function to send an event report to the bus.
 
void send_message_to (Defs::MTI mti, NodeHandle dst, const string &payload=EMPTY_PAYLOAD)
 Sends an addressed message to the bus.
 

Private Member Functions

void start_node () override
 Hook for clients to initialize the node-specific components.
 
uint64_t get_pip () override
 Get the PIP response value.
 

Private Attributes

DefaultNode node_
 The actual node.
 
ProtocolIdentificationHandler pipHandler_ {&node_, PIP_RESPONSE}
 Handles PIP requests.
 
SNIPHandler snipHandler_ {iface(), &node_, &infoFlow_}
 Handles SNIP requests.
 

Static Private Attributes

static const auto PIP_RESPONSE
 

Additional Inherited Members

- Static Public Member Functions inherited from openlcb::SimpleStackBase
static void factory_reset_all_events (const InternalConfigData &ofs, uint64_t node_id, int fd)
 Overwrites all events in the eeprom with a brand new event ID.
 
static void set_event_offsets (const vector< uint16_t > *offsets)
 Call this function at the beginning of appl_main, just before {} or { create_config_file_if_needed} if the list of event offsets are dyamically created instead of statically linked.
 
- Static Public Attributes inherited from openlcb::SimpleStackBase
static const unsigned EXECUTOR_PRIORITIES = 5
 
- Protected Member Functions inherited from openlcb::SimpleCanStackBase
void start_iface (bool restart) override
 Helper function for start_stack et al.
 
- Protected Member Functions inherited from openlcb::SimpleStackBase
void start_stack (bool delay_start)
 Call this function once after the actual IO ports are set up.
 
void default_start_node ()
 Exports the memory config spaces that are typically used for a complex node.
 
- Protected Attributes inherited from openlcb::SimpleStackBase
Executor< EXECUTOR_PRIORITIES > executor_ {NO_THREAD()}
 This executor's threads will be handled.
 
Service service_ {&executor_}
 Default service on the particular executor.
 
std::unique_ptr< PhysicalIfifaceHolder_
 Pointer to the polymorphic implementation of the OpenLCB If.
 
Ififace_ {ifaceHolder_->iface()}
 The OpenLCB interface object. Owned by ifaceHolder_;.
 
DatagramServicedatagramService_ {ifaceHolder_->datagram_service()}
 The datagram service bound to the interface object.
 
ConfigUpdateFlow configUpdateFlow_ {iface()}
 Calls the config listeners with the configuration FD.
 
InitializeFlow initFlow_ {&service_}
 The initialization flow takes care for node startup duties.
 
EventService eventService_ {iface()}
 Dispatches event protocol requests to the event handlers.
 
SimpleInfoFlow infoFlow_ {iface()}
 General flow for simple info requests.
 
MemoryConfigHandler memoryConfigHandler_
 
std::unique_ptr< HubFlowgcHub_
 All packets are forwarded to this hub in gridconnect format, if needed.
 
std::unique_ptr< GCAdapterBasegcAdapter_
 Bridge between canHub_ and gcHub_. Lazily initialized.
 
std::vector< std::unique_ptr< Destructable > > additionalComponents_
 Stores and keeps ownership of optional components.
 

Detailed Description

Helper class for bringing up all components needed for a typical OpenLCB node.

Usage: create a global variable of type SimpleCanStack with the node's NodeID as argument. For any additional components needed use the accessors (such as executor(), service(), or memory_config_handler()) to instantiate them. In the beginning of appl_main define how to access the bus, for example by add_can_port_async() or add_gridconnect_port() or connect_tcp_gridconnect_hub(). At the end of appl_main start the stack's executor by calling either loop_executor() or start_executor_thread().

Example: applications/async_blink/main.cxx

Definition at line 612 of file SimpleStack.hxx.

Constructor & Destructor Documentation

◆ SimpleCanStack()

openlcb::SimpleCanStack::SimpleCanStack ( const openlcb::NodeID  node_id)

Definition at line 92 of file SimpleStack.cxx.

Member Function Documentation

◆ get_pip()

uint64_t openlcb::SimpleCanStack::get_pip ( )
inlineoverrideprivatevirtual

Get the PIP response value.

Returns
PIP value

Reimplemented from openlcb::SimpleStackBase.

Definition at line 636 of file SimpleStack.hxx.

◆ node()

Node * openlcb::SimpleCanStack::node ( )
inlineoverridevirtual
Returns
the virtual node pointer of the main virtual node of the stack (as defined by the NodeID argument of the constructor).

Implements openlcb::SimpleStackBase.

Definition at line 619 of file SimpleStack.hxx.

◆ start_node()

void openlcb::SimpleCanStack::start_node ( )
inlineoverrideprivatevirtual

Hook for clients to initialize the node-specific components.

Implements openlcb::SimpleStackBase.

Definition at line 629 of file SimpleStack.hxx.

Member Data Documentation

◆ node_

DefaultNode openlcb::SimpleCanStack::node_
private

The actual node.

Definition at line 642 of file SimpleStack.hxx.

◆ PIP_RESPONSE

const auto openlcb::SimpleCanStack::PIP_RESPONSE
staticprivate
Initial value:
= Defs::EVENT_EXCHANGE | Defs::DATAGRAM |
Defs::MEMORY_CONFIGURATION | Defs::ABBREVIATED_DEFAULT_CDI |
Defs::SIMPLE_NODE_INFORMATION | Defs::CDI

Definition at line 625 of file SimpleStack.hxx.

◆ pipHandler_

ProtocolIdentificationHandler openlcb::SimpleCanStack::pipHandler_ {&node_, PIP_RESPONSE}
private

Handles PIP requests.

Definition at line 644 of file SimpleStack.hxx.

◆ snipHandler_

SNIPHandler openlcb::SimpleCanStack::snipHandler_ {iface(), &node_, &infoFlow_}
private

Handles SNIP requests.

Definition at line 646 of file SimpleStack.hxx.


The documentation for this class was generated from the following files: