VLCB
Loading...
Searching...
No Matches
LongMessageService.h
Go to the documentation of this file.
1// Copyright (C) Sven Rosvall (sven@rosvall.ie)
2// This file is part of VLCB-Arduino project on https://github.com/SvenRosvall/VLCB-Arduino
3// Licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
4// The full licence can be found at: http://creativecommons.org/licenses/by-nc-sa/4.0/
5
6#pragma once
7
8#include "Service.h"
9#include <vlcbdefs.hpp>
10
11namespace VLCB
12{
13
14const int LONG_MESSAGE_DEFAULT_DELAY = 20; // delay in milliseconds between sending successive long message fragments
15const int LONG_MESSAGE_RECEIVE_TIMEOUT = 5000; // timeout waiting for next long message packet
16const int NUM_EX_CONTEXTS = 4; // number of send and receive contexts for extended implementation = number of concurrent messages
17const int EX_BUFFER_LEN = 64; // size of extended send and receive buffers
18
19//
21//
22
23enum {
30};
31
32struct VlcbMessage;
33
34//
39//
41{
42
43public:
44
45 virtual void process() override;
46 virtual void processAction(const Action &action) override;
47 bool sendLongMessage(const void *msg, const unsigned int msg_len, const byte stream_id);
48 void subscribe(byte *stream_ids, const byte num_stream_ids, void *receive_buffer, const unsigned int receive_buffer_len, void (*messagehandler)(void *fragment, const unsigned int fragment_len, const byte stream_id, const byte status));
49 virtual void processReceivedMessageFragment(const VlcbMessage *frame);
50 bool is_sending();
51 void setDelay(byte delay_in_millis);
52 void setTimeout(unsigned int timeout_in_millis);
53
54 virtual VlcbServiceTypes getServiceID() const override { return SERVICE_ID_STREAMING; }
55 virtual byte getServiceVersionID() const override { return 1; }
56
57protected:
58
59 void handleMessage(const VlcbMessage *msg);
61
62 bool _is_receiving = false;
69 unsigned long _last_fragment_sent = 0UL, _last_fragment_received = 0UL;
70
71 void (*_messagehandler)(void *fragment, const unsigned int fragment_len, const byte stream_id, const byte status); // user callback function to receive long message fragments
72};
73
74
76
77// send and receive contexts
78
86
94
95//
97//
99{
100public:
101
102 bool allocateContexts(byte num_receive_contexts = NUM_EX_CONTEXTS, unsigned int receive_buffer_len = EX_BUFFER_LEN, byte num_send_contexts = NUM_EX_CONTEXTS);
103 bool sendLongMessage(const void *msg, const unsigned int msg_len, const byte stream_id);
104 virtual void process() override;
105 void subscribe(byte *stream_ids, const byte num_stream_ids, void (*messagehandler)(void *msg, unsigned int msg_len, byte stream_id, byte status));
106 virtual void processReceivedMessageFragment(const VlcbMessage *frame);
107 byte is_sending();
108 void use_crc(bool use_crc);
109
110private:
111
112 bool _use_crc = false;
113 byte _num_receive_contexts = NUM_EX_CONTEXTS, _num_send_contexts = NUM_EX_CONTEXTS;
114 receive_context_t **_receive_context = NULL;
115 send_context_t **_send_context = NULL;
116};
117
118}
a derived class to extend the base long message class to handle multiple concurrent messages,...
Definition LongMessageService.h:99
virtual void processReceivedMessageFragment(const VlcbMessage *frame)
handle an incoming long message Controller message fragment
Definition LongMessageService.cpp:555
bool sendLongMessage(const void *msg, const unsigned int msg_len, const byte stream_id)
Definition LongMessageService.cpp:390
virtual void process() override
Definition LongMessageService.cpp:459
void subscribe(byte *stream_ids, const byte num_stream_ids, void(*messagehandler)(void *msg, unsigned int msg_len, byte stream_id, byte status))
subscribe to a range of stream IDs
Definition LongMessageService.cpp:524
bool allocateContexts(byte num_receive_contexts=NUM_EX_CONTEXTS, unsigned int receive_buffer_len=EX_BUFFER_LEN, byte num_send_contexts=NUM_EX_CONTEXTS)
allocate memory for receive and send contexts
Definition LongMessageService.cpp:336
byte is_sending()
Definition LongMessageService.cpp:537
void use_crc(bool use_crc)
set whether to calculate and compare a CRC of the message
Definition LongMessageService.cpp:706
Definition LongMessageService.h:41
byte * _receive_buffer
Definition LongMessageService.h:63
bool is_sending()
Definition LongMessageService.cpp:290
byte _msg_delay
Definition LongMessageService.h:65
virtual void processReceivedMessageFragment(const VlcbMessage *frame)
Definition LongMessageService.cpp:146
void handleMessage(const VlcbMessage *msg)
Definition LongMessageService.cpp:44
unsigned int _incoming_message_length
Definition LongMessageService.h:66
unsigned int _receive_buffer_len
Definition LongMessageService.h:66
unsigned int _send_buffer_index
Definition LongMessageService.h:67
virtual VlcbServiceTypes getServiceID() const override
Return a unique ID for this service.
Definition LongMessageService.h:54
unsigned long _last_fragment_received
Definition LongMessageService.h:69
void subscribe(byte *stream_ids, const byte num_stream_ids, void *receive_buffer, const unsigned int receive_buffer_len, void(*messagehandler)(void *fragment, const unsigned int fragment_len, const byte stream_id, const byte status))
subscribe to a range of stream IDs
Definition LongMessageService.cpp:25
byte _receive_stream_id
Definition LongMessageService.h:64
byte _num_stream_ids
Definition LongMessageService.h:64
unsigned int _send_sequence_num
Definition LongMessageService.h:68
unsigned int _incoming_bytes_received
Definition LongMessageService.h:67
unsigned int _receive_buffer_index
Definition LongMessageService.h:66
unsigned int _receive_timeout
Definition LongMessageService.h:68
virtual void process() override
Definition LongMessageService.cpp:98
unsigned long _last_fragment_sent
Definition LongMessageService.h:69
virtual byte getServiceVersionID() const override
Return the version of the service specification implemented by this service.
Definition LongMessageService.h:55
void setTimeout(unsigned int timeout_in_millis)
Definition LongMessageService.cpp:322
byte * _send_buffer
Definition LongMessageService.h:63
void(* _messagehandler)(void *fragment, const unsigned int fragment_len, const byte stream_id, const byte status)
Definition LongMessageService.h:71
byte * _stream_ids
Definition LongMessageService.h:64
unsigned int _send_buffer_len
Definition LongMessageService.h:66
virtual void processAction(const Action &action) override
Called when there is an action available.
Definition LongMessageService.cpp:36
unsigned int _incoming_message_crc
Definition LongMessageService.h:67
bool sendMessageFragment(VlcbMessage *frame)
send next message fragment
Definition LongMessageService.cpp:298
unsigned int _expected_next_receive_sequence_num
Definition LongMessageService.h:68
bool _is_receiving
Definition LongMessageService.h:62
void setDelay(byte delay_in_millis)
Definition LongMessageService.cpp:311
bool sendLongMessage(const void *msg, const unsigned int msg_len, const byte stream_id)
Definition LongMessageService.cpp:60
byte _send_stream_id
Definition LongMessageService.h:64
Interface base class for all VLCB services.
Definition Service.h:25
Definition AbstractEventTeachingService.cpp:13
@ LONG_MESSAGE_TRUNCATED
Definition LongMessageService.h:29
@ LONG_MESSAGE_COMPLETE
Definition LongMessageService.h:25
@ LONG_MESSAGE_CRC_ERROR
Definition LongMessageService.h:28
@ LONG_MESSAGE_SEQUENCE_ERROR
Definition LongMessageService.h:26
@ LONG_MESSAGE_TIMEOUT_ERROR
Definition LongMessageService.h:27
@ LONG_MESSAGE_INCOMPLETE
Definition LongMessageService.h:24
const int EX_BUFFER_LEN
Definition LongMessageService.h:17
const int LONG_MESSAGE_RECEIVE_TIMEOUT
Definition LongMessageService.h:15
const int NUM_EX_CONTEXTS
Definition LongMessageService.h:16
const int LONG_MESSAGE_DEFAULT_DELAY
Definition LongMessageService.h:14
An action to be performed.
Definition Controller.h:51
CAN/Controller message type.
Definition Controller.h:30
Definition LongMessageService.h:79
unsigned int receive_buffer_index
Definition LongMessageService.h:83
byte receive_stream_id
Definition LongMessageService.h:81
unsigned int incoming_message_crc
Definition LongMessageService.h:83
unsigned int incoming_bytes_received
Definition LongMessageService.h:83
bool in_use
Definition LongMessageService.h:80
unsigned int incoming_message_length
Definition LongMessageService.h:83
unsigned int expected_next_receive_sequence_num
Definition LongMessageService.h:83
byte * buffer
Definition LongMessageService.h:82
unsigned long last_fragment_received
Definition LongMessageService.h:84
Definition LongMessageService.h:87
unsigned int send_buffer_index
Definition LongMessageService.h:91
byte * buffer
Definition LongMessageService.h:90
bool in_use
Definition LongMessageService.h:88
unsigned long last_fragment_sent
Definition LongMessageService.h:92
byte msg_delay
Definition LongMessageService.h:89
byte send_stream_id
Definition LongMessageService.h:89
unsigned int send_buffer_len
Definition LongMessageService.h:91
unsigned int send_sequence_num
Definition LongMessageService.h:91
VlcbServiceTypes
Definition vlcbdefs.hpp:487
@ SERVICE_ID_STREAMING
Definition vlcbdefs.hpp:502