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

Base class with utility functionality that implements some common functionality. More...

#include <DatagramHandlerDefault.hxx>

Inheritance diagram for openlcb::DefaultDatagramHandler:
StateFlow< MessageType, QueueType > TypedStateFlow< MessageType, UntypedStateFlow< QueueType > > UntypedStateFlow< QueueType > FlowInterface< MessageType > StateFlowWithQueue StateFlowBase Atomic LinkedObject< StateFlowWithQueue > Executable Notifiable QMember Destructable openlcb::BootloaderClient::WriteResponseHandler openlcb::MemoryConfigClient::ResponseFlow openlcb::MemoryConfigHandlerBase openlcb::MemoryConfigHandler openlcb::MemoryConfigStreamHandler

Public Member Functions

DatagramServicedg_service ()
 
- Public Member Functions inherited from StateFlow< MessageType, QueueType >
 StateFlow (Service *service)
 Constructor.
 
- Public Member Functions inherited from TypedStateFlow< MessageType, UntypedStateFlow< QueueType > >
 TypedStateFlow (Service *service)
 Constructor.
 
virtual ~TypedStateFlow ()
 Destructor.
 
void send (MessageType *msg, unsigned priority=UINT_MAX) OVERRIDE
 Sends a message to the state flow for processing.
 
virtual Action entry () override=0
 Entry into the StateFlow activity.
 
- Public Member Functions inherited from UntypedStateFlow< QueueType >
 UntypedStateFlow (Service *service)
 Constructor.
 
- Public Member Functions inherited from StateFlowWithQueue
void notify () override
 Wakeup call arrived. Schedules *this on the executor.
 
bool is_waiting ()
 
- Public Member Functions inherited from StateFlowBase
void run () override
 Callback from the executor.
 
Serviceservice ()
 Return a pointer to the service I am bound to.
 
- Public Member Functions inherited from Executable
void test_deletion ()
 
- Public Member Functions inherited from QMember
void init ()
 Initiailize a QMember, in place of a public placement construction.
 
- Public Member Functions inherited from LinkedObject< StateFlowWithQueue >
StateFlowWithQueuelink_next ()
 
- Public Member Functions inherited from FlowInterface< MessageType >
virtual Poolpool ()
 
virtual MessageType * type_helper ()
 This function is never user in the code, but GDB can use it to infer the correct message types.
 
MessageType * alloc ()
 Synchronously allocates a message buffer from the pool of this flow.
 
void alloc_async (Executable *target)
 Asynchronously allocates a message buffer from the pool of this flow.
 

Protected Member Functions

 DefaultDatagramHandler (DatagramService *if_datagram)
 
Action respond_ok (uint8_t flags)
 Sends a DATAGRAM_OK response to the datagram originator node.
 
void inline_respond_ok (uint8_t flags)
 Sends a DATAGRAM_OK response to the datagram originator node.
 
Action respond_reject (uint16_t error_code)
 Sends a DATAGRAM_REJECT response to the datagram originator node.
 
virtual Action ok_response_sent ()
 This state is where the handling will end up after a respond_ok call.
 
size_t size ()
 
const uint8_t * payload ()
 
- Protected Member Functions inherited from TypedStateFlow< MessageType, UntypedStateFlow< QueueType > >
void release () OVERRIDE
 Unrefs the current buffer.
 
void return_buffer ()
 For state flows that are operated using invoke_subflow_and_wait this is a way to hand back the buffer to the caller.
 
MessageType * message ()
 
MessageType * transfer_message ()
 Releases ownership of the current message.
 
- Protected Member Functions inherited from UntypedStateFlow< QueueType >
void send (BufferBase *msg, unsigned priority=UINT_MAX)
 Sends a message to the state flow for processing.
 
QMemberqueue_next (unsigned *priority) OVERRIDE
 Takes the front entry in the queue.
 
bool queue_empty () OVERRIDE
 
Action call_immediately (Callback c)
 Imediately call the next state upon return.
 
- Protected Member Functions inherited from StateFlowWithQueue
 StateFlowWithQueue (Service *service)
 Constructor.
 
Action exit ()
 Terminates the processing of this flow.
 
Action release_and_exit ()
 Terminates the processing of the current message.
 
BufferBasemessage ()
 
BufferBasetransfer_message ()
 Releases ownership of the current message.
 
void reset_message (BufferBase *message, unsigned priority)
 Sets the current message being processed.
 
unsigned priority ()
 
void set_priority (unsigned priority)
 Overrides the current priority.
 
void start_flow_at_init (Callback c)
 Call this from the constructor of the child class to do some work before the main queue processing loop begins.
 
- Protected Member Functions inherited from StateFlowBase
 StateFlowBase (Service *service)
 Constructor.
 
 ~StateFlowBase ()
 Destructor.
 
void reset_flow (Callback c)
 Resets the flow to the specified state.
 
bool is_state (Callback c)
 
bool is_terminated ()
 
void start_flow (Callback c)
 Resets the flow to the specified state and starts it.
 
Action again ()
 Call the current state again via call_immediately.
 
Action exit ()
 Terminate current StateFlow activity.
 
Action delete_this ()
 Terminates the flow and deletes *this.
 
Action set_terminated ()
 Sets the flow to terminated state.
 
Action call_immediately (Callback c)
 Imediately call the next state upon return.
 
Action wait ()
 Wait for an asynchronous call.
 
Action wait_and_call (Callback c)
 Wait for resource to become available before proceeding to next state.
 
template<class T >
Action allocate_and_call (FlowInterface< Buffer< T > > *target_flow, Callback c, Pool *pool=nullptr)
 Allocates a buffer from a pool and proceed to the next state when allocation is successful.
 
Action allocate_and_call (Callback c, QAsync *queue)
 Allocates an entry from an asynchronous queue, and transitions to a state once the allocation is complete.
 
template<class T >
Buffer< T > * full_allocation_result (FlowInterface< Buffer< T > > *target_flow)
 Takes the result of the asynchronous allocation without resetting the object.
 
template<class T >
T * full_allocation_result (TypedQAsync< T > *queue)
 Takes the result of the asynchronous allocation without resetting the object.
 
template<class T >
void cast_allocation_result (T **member)
 Takes the result of the asynchronous allocation without resetting the object.
 
template<class T >
Buffer< T > * get_allocation_result (FlowInterface< Buffer< T > > *target_flow)
 Takes the result of the asynchronous allocation.
 
Action yield_and_call (Callback c)
 Place the current flow to the back of the executor, and transition to a new state after we get the CPU again.
 
Action yield ()
 Place the current flow to the back of the executor, and re-try the current state after we get the CPU again.
 
Action sleep_and_call (::Timer *timer, long long timeout_nsec, Callback c)
 Suspends execution of this control flow for a specified time.
 
template<class T , typename... Args>
Action invoke_subflow_and_wait (FlowInterface< Buffer< T > > *target_flow, Callback c, Args &&... args)
 Calls a helper flow to perform some actions.
 
Action read_repeated (StateFlowSelectHelper *helper, int fd, void *buf, size_t size, Callback c, unsigned priority=Selectable::MAX_PRIO)
 Blocks until size bytes are read and then invokes the next state.
 
Action read_single (StateFlowSelectHelper *helper, int fd, void *buf, size_t size, Callback c, unsigned priority=Selectable::MAX_PRIO)
 Attempts to read at most size_t bytes, and blocks the caller until at least one byte is read.
 
Action read_nonblocking (StateFlowSelectHelper *helper, int fd, void *buf, size_t size, Callback c, unsigned priority=Selectable::MAX_PRIO)
 Attempts to read at most size bytes, and then invokes the next state, even if only zero bytes are available right now.
 
Action read_repeated_with_timeout (StateFlowTimedSelectHelper *helper, long long timeout_nsec, int fd, void *buf, size_t size, Callback c, unsigned priority=Selectable::MAX_PRIO)
 Blocks until size bytes are read, or a timeout expires.
 
Action internal_try_read ()
 Implementation state that gets repeatedly called upon every wakeup and tries to make progress on reading.
 
Action write_repeated (StateFlowSelectHelper *helper, int fd, const void *buf, size_t size, Callback c, unsigned priority=Selectable::MAX_PRIO)
 Writes some data into a file descriptor, repeating the operation as necessary until all bytes are written.
 
Action internal_try_write ()
 Implementation state that gets repeatedly called upon every wakeup and tries to make progress on writing.
 
- Protected Member Functions inherited from QMember
 QMember ()
 Constructor.
 
 ~QMember ()
 Destructor.
 
- Protected Member Functions inherited from Atomic
void lock ()
 
void unlock ()
 
- Protected Member Functions inherited from LinkedObject< StateFlowWithQueue >
StateFlowWithQueuelink_this ()
 
 LinkedObject ()
 Constructor. Puts *this on the linked list.
 
 ~LinkedObject ()
 Constructor. Removes *this from the linked list.
 
StateFlowWithQueuelink_next ()
 

Private Member Functions

void prepare_respond_ok (uint8_t flags)
 Helper function for respond_ok.
 
void respond_ok_helper (Buffer< GenMessage > *b)
 Helper function for respond_ok.
 
Action send_ok_response ()
 
Action send_reject_response ()
 

Private Attributes

uint16_t responseErrorCode_
 
openlcb::Defs::MTI responseMti_
 

Additional Inherited Members

- Public Types inherited from TypedStateFlow< MessageType, UntypedStateFlow< QueueType > >
typedef Base::Action Action
 Allows using Action without having StateFlowBase:: prefix in front of it.
 
- Public Types inherited from FlowInterface< MessageType >
typedef MessageType message_type
 Stores the message template type for external reference.
 
- Static Public Member Functions inherited from StateFlowBase
template<class T , typename... Args>
static void invoke_subflow_and_ignore_result (FlowInterface< Buffer< T > > *target_flow, Args &&... args)
 Calls a helper flow to perform some actions.
 
- Static Public Member Functions inherited from LinkedObject< StateFlowWithQueue >
static StateFlowWithQueuelink_head ()
 
static Atomichead_mu ()
 Locks the list for modification (at any entry!).
 
- Static Public Member Functions inherited from FlowInterface< MessageType >
static MessageType * cast_alloc (QMember *entry)
 Down casts and initializes an asynchronous allocation result to the appropriate flow's buffer type.
 
- Protected Types inherited from UntypedStateFlow< QueueType >
typedef Action(StateFlowBase::* Callback) ()
 State Flow callback prototype.
 
- Protected Types inherited from StateFlowBase
typedef Action(StateFlowBase::* Callback) ()
 State Flow callback prototype.
 
- Static Protected Member Functions inherited from LinkedObject< StateFlowWithQueue >
static StateFlowWithQueuelink_head ()
 
static Atomichead_mu ()
 Locks the list for modification (at any entry!).
 
- Protected Attributes inherited from QMember
QMembernext
 pointer to the next member in the queue
 
- Protected Attributes inherited from LinkedObject< StateFlowWithQueue >
StateFlowWithQueuelink_
 Linked list pointer.
 
- Static Protected Attributes inherited from LinkedObject< StateFlowWithQueue >
static StateFlowWithQueuehead_
 Beginning of the list.
 

Detailed Description

Base class with utility functionality that implements some common functionality.

Implementations should override the entry() function to handle new incoming datagrams, then they must eventually call respond_ok or respond_reject.

Definition at line 47 of file DatagramHandlerDefault.hxx.

Constructor & Destructor Documentation

◆ DefaultDatagramHandler()

openlcb::DefaultDatagramHandler::DefaultDatagramHandler ( DatagramService if_datagram)
inlineprotected

Definition at line 50 of file DatagramHandlerDefault.hxx.

Member Function Documentation

◆ dg_service()

DatagramService * openlcb::DefaultDatagramHandler::dg_service ( )
inline

Definition at line 56 of file DatagramHandlerDefault.hxx.

◆ inline_respond_ok()

void openlcb::DefaultDatagramHandler::inline_respond_ok ( uint8_t  flags)
inlineprotected

Sends a DATAGRAM_OK response to the datagram originator node.

Call this from the user handler. Control will be returned ot the caller.

Parameters
flagsis the 1-byte payload of the DATAGRAM_OK message.

Definition at line 80 of file DatagramHandlerDefault.hxx.

◆ ok_response_sent()

virtual Action openlcb::DefaultDatagramHandler::ok_response_sent ( )
inlineprotectedvirtual

This state is where the handling will end up after a respond_ok call.

The user is responsible to eventually doing release and exit().

Reimplemented in openlcb::BootloaderClient::WriteResponseHandler, and openlcb::MemoryConfigHandlerBase.

Definition at line 145 of file DatagramHandlerDefault.hxx.

◆ payload()

const uint8_t * openlcb::DefaultDatagramHandler::payload ( )
inlineprotected
Returns
the incoming datagram payload. Byte zero will be the datagram ID.

Definition at line 158 of file DatagramHandlerDefault.hxx.

◆ prepare_respond_ok()

void openlcb::DefaultDatagramHandler::prepare_respond_ok ( uint8_t  flags)
inlineprivate

Helper function for respond_ok.

Parameters
flagsflag byte to be returned.

Definition at line 91 of file DatagramHandlerDefault.hxx.

◆ respond_ok()

Action openlcb::DefaultDatagramHandler::respond_ok ( uint8_t  flags)
inlineprotected

Sends a DATAGRAM_OK response to the datagram originator node.

Call this from the user handler. The flow will end up in the ok_response_sent() state.

Parameters
flagsis the 1-byte payload of the DATAGRAM_OK message.

Definition at line 67 of file DatagramHandlerDefault.hxx.

◆ respond_ok_helper()

void openlcb::DefaultDatagramHandler::respond_ok_helper ( Buffer< GenMessage > *  b)
inlineprivate

Helper function for respond_ok.

Definition at line 98 of file DatagramHandlerDefault.hxx.

◆ respond_reject()

Action openlcb::DefaultDatagramHandler::respond_reject ( uint16_t  error_code)
inlineprotected

Sends a DATAGRAM_REJECT response to the datagram originator node.

Call this from the user handler. The flow will not return to the caller, but release the incoming datagram and return to wait for a new datagram.

Parameters
error_codeis the 2-byte error code in the DATAGRAM_REJECT message.

Definition at line 121 of file DatagramHandlerDefault.hxx.

◆ send_ok_response()

Action openlcb::DefaultDatagramHandler::send_ok_response ( )
inlineprivate

Definition at line 106 of file DatagramHandlerDefault.hxx.

◆ send_reject_response()

Action openlcb::DefaultDatagramHandler::send_reject_response ( )
inlineprivate

Definition at line 131 of file DatagramHandlerDefault.hxx.

◆ size()

size_t openlcb::DefaultDatagramHandler::size ( )
inlineprotected
Returns
the size of the incoming datagram payload.

Definition at line 151 of file DatagramHandlerDefault.hxx.

Member Data Documentation

◆ responseErrorCode_

uint16_t openlcb::DefaultDatagramHandler::responseErrorCode_
private

Definition at line 165 of file DatagramHandlerDefault.hxx.

◆ responseMti_

openlcb::Defs::MTI openlcb::DefaultDatagramHandler::responseMti_
private

Definition at line 166 of file DatagramHandlerDefault.hxx.


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