You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
7.4 KiB

/**
* @file Receiver.hpp
* @brief Header file for the Receiver class.
* @author Adam Prochazka <xproch0f>
*
* This file contains the declaration of the Receiver class which is responsible for
* managing the serial communication and processing the received data to display images.
*/
#include "main.hpp"
#ifndef DISPLAYER_HPP
#include "Displayer.hpp"
#endif
/**
* @class Receiver
* @brief Handles receiving data from the serial port and buffering the data for the Displayer.
*/
class Receiver{
private:
int cdcFile;
struct termios tty;
int currentBufferIndex = 0;
std::mutex currentBufferIndexMutex;
std::vector<uint8_t> buffer_initial{
0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,
0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,
0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x92, 0x8a, 0x00,
0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,
0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,
0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,
0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,
0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,
0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,
0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,
0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,
0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,
0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,
0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,
0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,
0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,
0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,
0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,
0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,
0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,
0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,
0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,
0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,
0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0xff, 0xd9
};
std::vector<uint8_t> buffer1;
std::vector<uint8_t> buffer2;
std::vector<uint8_t> buffer3;
Displayer *dis;
int distance = 0;
int sequenceEndedFF = 0; ///< Flag to indicate if the sequence has ended with 0xFF.
int simulateIdx = 0;
int debugFileIdx = 0;
public:
/**
* @brief Constructor for the Receiver class.
* @param displayerPtr Pointer to the Displayer instance.
*/
Receiver(Displayer *displayerPtr);
/**
* @brief Opens the serial port stream.
* @param port Name of serial port to be openned.
*/
void openStream(char * port);
/**
* @brief Closes the serial port stream.
*/
void closeStream();
/**
* @brief Initializes the serial port settings.
* @return 1 if successful, -1 if an error occurred.
*/
int initSerial();
/**
* @brief Reads data from the CDC device.
* @param[out] character Pointer to the character buffer to store the read data.
* @return 0 if successful, -1 if error occurred.
*/
int readCdcData(unsigned char (*character)[CDC_FRAME_SIZE]);
/**
* @brief Prints char as hexadecimal value with a 0x prefix.
* @param value The char to be printed.
*/
void printHex(unsigned char value);
/**
* @brief Fills the buffer with data from the serial port.
* @param saveToFile Indicates if image data should be saved to file.
* @return 0.
*/
int fillBuffer(bool saveToFile = false);
/**
* @brief Gets the distance data from serial port and print it to std out.
* @return 0 if successful, 1 if error occurred.
*/
int getDistance();
/**
* @brief Sends the buffer to the Displayer for rendering.
* @param printRaw Bool that indicates weather received byte data should be printed to std::out (for debug).
*/
void bufferToDisplay(bool printRaw = false);
/**
* @brief Initializes textures in Displayer to default values.
*/
void initTextures();
/**
* @brief Finds a sequence of two characters in the given string.
* @param[in] str Pointer to the input string.
* @param ch1 First character of the sequence to find.
* @param ch2 Second character of the sequence to find.
* @return Index of the first occurrence of the sequence, or -1 if not found.
*/
int findSequence(unsigned char (*str)[CDC_FRAME_SIZE], unsigned char ch1, unsigned char ch2);
/**
* @brief Find index of bytes signalizing start of image.
* @param[in] str Pointer to the input string.
* @return Index of the start of the data sequence, or -1 if not found.
*/
int findStart(unsigned char (*str)[CDC_FRAME_SIZE]);
/**
* @brief Find index of bytes signalizing end of image.
* @param[in] str Pointer to the input string.
* @return Index of the start of the data sequence, or -1 if not found.
*/
int findEnd(unsigned char (*str)[CDC_FRAME_SIZE]);
/**
* @brief Test function to simulate reading from serial port.
* @param[in] str Pointer to the string buffer.
* @return 0.
*/
int simulateRead(unsigned char (*character)[CDC_FRAME_SIZE]);
};