This commit is contained in:
r.koeppe
2024-05-14 02:14:13 +02:00
parent 0052d3984b
commit 2d22ccd2d6
1423 changed files with 354055 additions and 7 deletions

View File

@ -0,0 +1,103 @@
#ifndef _VNPROTOCOL_UART_PACKETFINDER_H_
#define _VNPROTOCOL_UART_PACKETFINDER_H_
#include "nocopy.h"
#include "vntime.h"
#include "packet.h"
#if PYTHON
#include "vn/util/boostpython.h"
#endif
namespace vn {
namespace protocol {
namespace uart {
/// \brief Helps with management of communication with a sensor using the UART
/// protocol.
///
/// Internally, the PacketFinder keeps track of a running data index which
/// keeps a running count of the bytes that are processed by the class. This is
/// useful for users who wish to keep track of where packets where found in the
/// incoming raw data stream. When the PacketFinder receives its first byte
/// from the user, this is given the index of 0 for the running index and
/// incremented for each byte received.
class vn_proglib_DLLEXPORT PacketFinder : private util::NoCopy
{
public:
/// \brief Defines the signature for a method that can receive
/// notifications of new valid packets found.
///
/// \param[in] userData Pointer to user data that was initially supplied
/// when the callback was registered via registerPossiblePacketFoundHandler.
/// \param[in] possiblePacket The possible packet that was found.
/// \param[in] packetStartRunningIndex The running index of the start of
/// the packet.
/// \param[in] timestamp The timestamp the packet was found.
typedef void (*ValidPacketFoundHandler)(void* userData, Packet& packet, size_t runningIndexOfPacketStart, xplat::TimeStamp timestamp);
/// \brief Creates a new /ref PacketFinder with internal buffers to store
/// incoming bytes and alert when valid packets are received.
PacketFinder();
/// \brief Creates a new /ref PacketFinder with an internal buffer the size
/// specified.
///
/// \param[in] internalReceiveBufferSize The number of bytes to make the
/// internal buffer.
explicit PacketFinder(size_t internalReceiveBufferSize);
~PacketFinder();
/// \brief Adds new data to the internal buffers and processes the received
/// data to determine if any new received packets are available.
///
/// \param[in] data The data buffer containing the received data.
/// \param[in] length The number of bytes of data in the buffer.
void processReceivedData(char data[], size_t length);
void processReceivedData(char data[], size_t length, bool bootloaderFilter);
/// \brief Adds new data to the internal buffers and processes the received
/// data to determine if any new received packets are available.
///
/// \param[in] data The data buffer containing the received data.
/// \param[in] length The number of bytes of data in the buffer.
/// \param[in] timestamp The time when the data was received.
void processReceivedData(char data[], size_t length, bool bootloaderFilter, xplat::TimeStamp timestamp);
#if PYTHON
void processReceivedData(boost::python::list data);
#endif
/// \brief Registers a callback method for notification when a new possible
/// packet is found.
///
/// \param[in] userData Pointer to user data, which will be provided to the
/// callback method.
/// \param[in] handler The callback method.
void registerPossiblePacketFoundHandler(void* userData, ValidPacketFoundHandler handler);
/// \brief Unregisters the registered callback method.
void unregisterPossiblePacketFoundHandler();
#if PYTHON
boost::python::object* register_packet_found_handler(/*boost::python::object* callable*/ PyObject* callable);
//void register_packet_found_handler(boost::python::object* callable);
#endif
private:
struct Impl;
Impl *_pi;
};
}
}
}
#endif