2021-03-05 12:57:42 +01:00
|
|
|
#ifndef LINUX_CSP_CSPCOMIF_H_
|
|
|
|
#define LINUX_CSP_CSPCOMIF_H_
|
2020-12-14 08:42:48 +01:00
|
|
|
|
2022-01-17 15:58:27 +01:00
|
|
|
#include <csp/csp.h>
|
2023-03-24 11:33:43 +01:00
|
|
|
#include <csp/csp_autoconfig.h>
|
2020-12-14 08:42:48 +01:00
|
|
|
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
|
|
|
|
#include <fsfw/objectmanager/SystemObject.h>
|
2022-08-24 17:27:47 +02:00
|
|
|
#include <fsfw/returnvalues/returnvalue.h>
|
2023-03-24 11:33:43 +01:00
|
|
|
#include <pthread.h>
|
2020-12-14 08:42:48 +01:00
|
|
|
|
|
|
|
#include <unordered_map>
|
2022-01-17 15:58:27 +01:00
|
|
|
#include <vector>
|
2020-12-14 08:42:48 +01:00
|
|
|
|
|
|
|
/**
|
2020-12-20 17:35:03 +01:00
|
|
|
* @brief This class serves as the communication interface to devices
|
|
|
|
* supporting the CSP protocol. As physical layer can0 is used
|
|
|
|
* in this implementation.
|
|
|
|
* @author J. Meier
|
2020-12-14 08:42:48 +01:00
|
|
|
*/
|
2022-01-17 15:58:27 +01:00
|
|
|
class CspComIF : public DeviceCommunicationIF, public SystemObject {
|
|
|
|
public:
|
2023-03-24 11:33:43 +01:00
|
|
|
CspComIF(object_id_t objectId, const char *routeTaskName, uint32_t routerRealTimePriority);
|
2022-01-17 15:58:27 +01:00
|
|
|
virtual ~CspComIF();
|
|
|
|
|
|
|
|
ReturnValue_t initializeInterface(CookieIF *cookie) override;
|
|
|
|
ReturnValue_t sendMessage(CookieIF *cookie, const uint8_t *sendData, size_t sendLen) override;
|
|
|
|
ReturnValue_t getSendSuccess(CookieIF *cookie) override;
|
|
|
|
ReturnValue_t requestReceiveMessage(CookieIF *cookie, size_t requestLen) override;
|
|
|
|
ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **readData, size_t *readLen) override;
|
|
|
|
|
|
|
|
private:
|
2023-03-24 11:33:43 +01:00
|
|
|
#ifdef CSP_USE_RDP
|
|
|
|
//! If RDP is enabled, the router needs to awake some times to check timeouts
|
|
|
|
static constexpr uint32_t FIFO_TIMEOUT = 100;
|
|
|
|
#else
|
|
|
|
//! If no RDP, the router can sleep untill data arrives
|
|
|
|
static constexpr uint32_t FIFO_TIMEOUT = CSP_MAX_DELAY;
|
|
|
|
#endif
|
2022-01-17 15:58:27 +01:00
|
|
|
/**
|
|
|
|
* @brief This function initiates the CSP transfer.
|
|
|
|
*
|
|
|
|
* @param cspAddress The CSP address of the target device.
|
|
|
|
* @param cspPort The port of the target device.
|
|
|
|
* @param timeout The timeout to wait for csp_send and csp_read
|
|
|
|
* functions. Specifies how long the functions wait
|
|
|
|
* for a successful operation.
|
|
|
|
* @param cmdBuffer The data to send.
|
|
|
|
* @param cmdLen The number of bytes to send.
|
|
|
|
* @param querySize The size of the requested message.
|
|
|
|
*/
|
|
|
|
ReturnValue_t cspTransfer(uint8_t cspAddress, uint8_t cspPort, const uint8_t *cmdBuffer,
|
|
|
|
int cmdLen, uint16_t querySize);
|
|
|
|
|
|
|
|
typedef uint8_t node_t;
|
2022-08-27 01:02:08 +02:00
|
|
|
struct ReplyInfo {
|
|
|
|
ReplyInfo(size_t maxLen) : replyBuf(maxLen){};
|
|
|
|
std::vector<uint8_t> replyBuf;
|
|
|
|
size_t replyLen = 0;
|
|
|
|
};
|
|
|
|
using VectorBufferMap = std::unordered_map<node_t, ReplyInfo>;
|
2022-01-17 15:58:27 +01:00
|
|
|
|
|
|
|
/* In this map assigns reply buffers to a CSP device */
|
|
|
|
VectorBufferMap cspDeviceMap;
|
|
|
|
|
|
|
|
/* This is the CSP address of the OBC. */
|
|
|
|
node_t cspOwnAddress = 1;
|
|
|
|
|
2023-03-24 11:33:43 +01:00
|
|
|
pthread_t routerTaskHandle{};
|
|
|
|
uint32_t routerRealTimePriority = 0;
|
|
|
|
const char *routerTaskName;
|
|
|
|
|
2022-01-17 15:58:27 +01:00
|
|
|
/* Interface struct for csp protocol stack */
|
|
|
|
csp_iface_t csp_if;
|
|
|
|
char canInterface[5] = "can0";
|
|
|
|
int bitrate = 1000;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Function to extract the csp port and the query size from the
|
|
|
|
* command buffer.
|
|
|
|
*/
|
|
|
|
ReturnValue_t getPortAndQuerySize(const uint8_t **sendData, size_t *sendLen, uint8_t *cspPort,
|
|
|
|
uint16_t *querySize);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This function initiates the ping request.
|
|
|
|
*/
|
|
|
|
void initiatePingRequest(uint8_t cspAddress, uint16_t querySize);
|
2023-03-24 11:33:43 +01:00
|
|
|
|
|
|
|
ReturnValue_t startRouterTask();
|
|
|
|
static void *routerWorkWrapper(void *args);
|
2020-12-14 08:42:48 +01:00
|
|
|
};
|
|
|
|
|
2021-03-05 12:57:42 +01:00
|
|
|
#endif /* LINUX_CSP_CSPCOMIF_H_ */
|