2020-12-13 22:12:57 +01:00
|
|
|
#ifndef FSFW_RMAP_RMAPCHANNELIF_H_
|
|
|
|
#define FSFW_RMAP_RMAPCHANNELIF_H_
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
#include <cstddef>
|
|
|
|
|
2020-08-13 20:53:35 +02:00
|
|
|
#include "RMAPCookie.h"
|
2021-07-19 18:26:54 +02:00
|
|
|
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
#include "rmapConf.h"
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2018-07-13 18:28:26 +02:00
|
|
|
class RMAPChannelIF {
|
2022-02-02 10:29:30 +01:00
|
|
|
public:
|
|
|
|
virtual ~RMAPChannelIF(){};
|
|
|
|
/**
|
|
|
|
* Reset an RMAP channel
|
|
|
|
*
|
|
|
|
* Clears the receive buffer (all received messages are deleted) and resets the descriptor table.
|
|
|
|
* Also checks for errors in the descriptors and submits them to FDIR (aka stdout)
|
|
|
|
*
|
|
|
|
* @param channel to reset
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* - @c LINK_DOWN when the link is down and all replies were missed
|
|
|
|
* - @c COMMAND_CHANNEL_DEACTIVATED if the channel's port is NULL
|
|
|
|
* - @c RETURN_OK else
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t reset() = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* Check if a channel is active (ie has a port)
|
|
|
|
*
|
|
|
|
* @param channel_nr
|
|
|
|
* @return
|
|
|
|
* - @c COMMAND_OK if channel is active
|
|
|
|
* - @c COMMAND_CHANNEL_DEACTIVATED if channel is deactivated
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t isActive() = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* Assign a SpaceWire port to the Channel
|
|
|
|
*
|
|
|
|
* @param port Number of the port. SpaceWire devices are mapped to port numbers to allow
|
|
|
|
* checking of the validity
|
|
|
|
* @param dest_addr the destination address used by all packets sent from this channel
|
|
|
|
* @param src_addr the source address used by all packets sent from this channel and used when
|
|
|
|
* checking incoming packets
|
|
|
|
* @return
|
|
|
|
* - @c COMMAND_OK if port was changed
|
|
|
|
* - @c COMMAND_PORT_OUT_OF_RANGE if the port is invalid
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t setPort(int8_t port, uint8_t dest_addr, uint8_t src_addr) = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* Assign a SpaceWire port to the Channel
|
|
|
|
*
|
|
|
|
* same as setPort(int8_t port, uint8_t dest_addr, uint8_t src_addr), only the addresses are left
|
|
|
|
* unchanged
|
|
|
|
*
|
|
|
|
* @param port Number of the port. SpaceWire devices are mapped to port numbers to allow
|
|
|
|
* checking of the validity
|
|
|
|
* @return
|
|
|
|
* - @c COMMAND_OK if port was changed
|
|
|
|
* - @c COMMAND_PORT_OUT_OF_RANGE if the port is invalid
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t setPort(int8_t port) = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* Send an RMAP command
|
|
|
|
*
|
|
|
|
* @param cookie the cookie used with this call
|
|
|
|
* @param instruction the instruction byte that will be sent (this defines if it is a read or
|
|
|
|
* write command)
|
|
|
|
* @param data data to be sent
|
|
|
|
* @param datalen length of data
|
|
|
|
* @return
|
|
|
|
* - @c RETURN_OK
|
2022-02-14 14:54:20 +01:00
|
|
|
* - @c COMMAND_NO_DESCRIPTORS_AVAILABLE no descriptors available for sending
|
|
|
|
* command; command was not sent
|
|
|
|
* - @c COMMAND_BUFFER_FULL no receiver buffer available for expected len;
|
2022-02-02 10:29:30 +01:00
|
|
|
* command was not sent
|
2022-02-14 14:54:20 +01:00
|
|
|
* - @c COMMAND_TOO_BIG the data that was to be sent was too long for the hw
|
|
|
|
* to handle (write command) or the expected len was bigger than maximal expected len (read
|
|
|
|
* command) command was not sent
|
2022-02-02 10:29:30 +01:00
|
|
|
* - @c COMMAND_CHANNEL_DEACTIVATED the channel has no port set
|
2022-02-14 14:54:20 +01:00
|
|
|
* - @c NOT_SUPPORTED if you dont feel like
|
|
|
|
* implementing something...
|
2022-02-02 10:29:30 +01:00
|
|
|
*/
|
|
|
|
virtual ReturnValue_t sendCommand(RMAPCookie *cookie, uint8_t instruction, const uint8_t *data,
|
|
|
|
size_t datalen) = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* get the reply to an rmap command
|
|
|
|
*
|
|
|
|
* @param cookie the cookie the command was sent with
|
|
|
|
* @param databuffer a pointer to a pointer the location of the reply will be written to
|
|
|
|
* @param len a pointer to the variable the length of the reply will be written to
|
|
|
|
* @return
|
|
|
|
* - @c REPLY_NO_REPLY no reply was received
|
|
|
|
* - @c REPLY_NOT_SENT command was not sent, implies no reply
|
|
|
|
* - @c REPLY_NOT_YET_SENT command is still waiting to be sent
|
2022-02-14 14:54:20 +01:00
|
|
|
* - @c WRITE_REPLY_INTERFACE_BUSY Interface is busy (transmission buffer still
|
|
|
|
* being processed)
|
2022-02-02 10:29:30 +01:00
|
|
|
* - @c WRITE_REPLY_TRANSMISSION_ERROR Interface encountered errors during last
|
|
|
|
* operation, data could not be processed. (transmission error)
|
|
|
|
* - @c WRITE_REPLY_INVALID_DATA Invalid data (amount / value)
|
|
|
|
* - @c WRITE_REPLY_NOT_SUPPORTED
|
|
|
|
* - all RMAP standard replies
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t getReply(RMAPCookie *cookie, uint8_t **databuffer, size_t *len) = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param cookie
|
|
|
|
* @param data
|
|
|
|
* @param datalen
|
|
|
|
* @param databuffer
|
|
|
|
* @param len
|
|
|
|
* @param timeout_us
|
|
|
|
* @return
|
|
|
|
* - all replies of sendCommand() and getReply()
|
|
|
|
* - @c REPLY_TIMEOUT timeout
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t sendCommandBlocking(RMAPCookie *cookie, uint8_t *data, uint32_t datalen,
|
|
|
|
uint8_t **databuffer, uint32_t *len,
|
|
|
|
uint32_t timeout_us) = 0;
|
2016-06-15 23:48:41 +02:00
|
|
|
};
|
|
|
|
|
2020-12-13 22:12:57 +01:00
|
|
|
#endif /* FSFW_RMAP_RMAPCHANNELIF_H_ */
|