IpbusMock  1.0.0
Library which integrates IPbus use in Phoenix
Loading...
Searching...
No Matches
PIpBusBackend.cpp
Go to the documentation of this file.
1/***************************************
2 Author: Jean Jacquemier & Thibaut Oprinsen
3 Email: jean.jacquemier@lapp.in2p3.fr
4 License: CeCILL-C
5****************************************/
6
7#include "PIpBusBackend.h"
8#include "ipbrw.h"
9
12: p_uaSocket(nullptr)
13{
14
15}
16
22
28bool PIpBusSocket::createClientSocket(const Param & extraParam){
30 return p_uaSocket != nullptr;
31}
32
38bool PIpBusSocket::createServerSocket(const Param & extraParam){
39 return createClientSocket(extraParam);
40}
41
43 return p_uaSocket != nullptr;
44}
45
48 if(p_uaSocket != nullptr){
49 p_uaSocket->close();
50 p_uaSocket = nullptr;
51 }
52}
53
59
65PIpBusBackend::Param PIpBusBackend::client(std::string &connectionFilePath, std::string &connectionId){
66 Param param;
67 param.connectionFilePath = connectionFilePath;
68 param.connectionId = connectionId;
69 return param;
70}
71
77PIpBusBackend::Param PIpBusBackend::server(std::string &connectionFilePath, std::string &connectionId){
78 return PIpBusBackend::client(connectionFilePath, connectionId);
79}
80
86bool PIpBusBackend::createClientSocket(PIpBusBackend::Socket & socket, const PSocketParam & socketParam, const Param & param){
87 return socket.createClientSocket(param);
88}
89
95bool PIpBusBackend::createServerSocket(PIpBusBackend::Socket & socket, const PSocketParam & socketParam, const Param & param){
96 return socket.createServerSocket(param);
97}
98
100
103// void PIpBusBackend::msgToMock(DataStreamMsg & mockMsg, const PIpBusBackend::Message & msg){
104// size_t dataSize(msg.size());
105// mockMsg.resize(dataSize);
106// memcpy(mockMsg.data(), msg.dataStreamMsg.data(), dataSize);
107// }
108
109void PIpBusBackend::msgToMock(DataStreamMsg & mockMsg, const PIpBusBackend::Message & msg){
110 size_t dataSize(data_size(msg));
111 mockMsg.resize(dataSize);
112 DataStreamIter iter = (DataStreamIter)mockMsg.data();
113 data_message_save(iter, msg);
114}
115
117
120// void PIpBusBackend::mockToMsg(PIpBusBackend::Message & msg, DataStreamMsg & mockMsg){
121// size_t dataSize(mockMsg.size());
122// msg.dataStreamMsg.resize(dataSize);
123// memcpy((void*)msg.dataStreamMsg.data(), mockMsg.data(), dataSize);
124// }
125
126void PIpBusBackend::mockToMsg(PIpBusBackend::Message & msg, DataStreamMsg & mockMsg){
127 DataStreamIter iter = (DataStreamIter)mockMsg.data();
128 data_message_load(iter, msg);
129}
130
136PSendStatus::PSendStatus PIpBusSocket::sendMsg(PIpBusSocket::Message & msg, PSendFlag::PSendFlag flag){
137 if(p_uaSocket == nullptr){
138 return PSendStatus::BROKEN_SOCKET;
139 }
140 try {
141 bool success;
142 if(msg.value.get()->size() > 1){
143 success = p_uaSocket->writeBlock(msg.nodeId, *msg.value.get());
144 }
145 else if(msg.value.get()->size() == 1){
146 success = p_uaSocket->write(msg.nodeId, msg.value.get()->at(0));
147 }
148 else {
149 // Empty value vector
150 return PSendStatus::CANNOT_SERIALIZE_DATA;
151 }
152
153 return success ? PSendStatus::OK : PSendStatus::BROKEN_BACKEND;
154 }
155 catch (const uhal::exception::WriteAccessDenied& e) {
156 // Write access denied for this node
157 return PSendStatus::BROKEN_BACKEND;
158 }
159 catch (const uhal::exception::BulkTransferOnSingleRegister& e) {
160 // Attempted block transfer on a single register
161 return PSendStatus::BROKEN_BACKEND;
162 }
163 catch (const uhal::exception::BulkTransferRequestedTooLarge& e) {
164 // Block transfer too large
165 return PSendStatus::BROKEN_BACKEND;
166 }
167 catch (const uhal::exception::NoBranchFoundWithGivenUID& e) {
168 // Node ID not found
169 return PSendStatus::BROKEN_BACKEND;
170 }
171 catch (const std::out_of_range& e) {
172 // Out of range error accessing vector
173 return PSendStatus::CANNOT_SERIALIZE_DATA;
174 }
175 catch (const std::bad_alloc& e) {
176 // Memory allocation problem
177 return PSendStatus::BROKEN_BACKEND;
178 }
179 catch (...) {
180 // Any other non-standard exception
181 return PSendStatus::BROKEN_BACKEND;
182 }
183}
184
190PRecvStatus::PRecvStatus PIpBusSocket::recvMsg(PIpBusSocket::Message & msg, PRecvFlag::PRecvFlag flag){
191 if(p_uaSocket == nullptr){
192 return PRecvStatus::BROKEN_SOCKET;
193 }
194
195 try {
196 bool success = false;
197 if(msg.sizeValue > 1){
198 success = p_uaSocket->readBlock(msg.nodeId, *msg.value.get(), msg.sizeValue);
199 }
200 else if(msg.sizeValue == 1){
201 uint32_t readValue = 0;
202 success = p_uaSocket->read(msg.nodeId, readValue);
203 if(success) {
204 msg.value.get()->clear();
205 msg.value.get()->push_back(readValue);
206 }
207 }
208 else {
209 // Invalid size (0)
210 return PRecvStatus::NO_MESSAGE_RECEIVED;
211 }
212
213 return success ? PRecvStatus::OK : PRecvStatus::BROKEN_BACKEND;
214 }
215 catch (const uhal::exception::ReadAccessDenied& e) {
216 // Read access denied for this node
217 return PRecvStatus::BROKEN_BACKEND;
218 }
219 catch (const uhal::exception::BulkTransferOnSingleRegister& e) {
220 // Attempted block transfer on a single register
221 return PRecvStatus::BROKEN_BACKEND;
222 }
223 catch (const uhal::exception::BulkTransferRequestedTooLarge& e) {
224 // Block transfer too large
225 return PRecvStatus::BROKEN_BACKEND;
226 }
227 catch (const uhal::exception::NoBranchFoundWithGivenUID& e) {
228 // Node ID not found
229 return PRecvStatus::BROKEN_BACKEND;
230 }
231 catch (const std::out_of_range& e) {
232 // Out of range error accessing vector
233 return PRecvStatus::CANNOT_DESERIALIZE_DATA;
234 }
235 catch (const std::bad_alloc& e) {
236 // Memory allocation problem
237 return PRecvStatus::BROKEN_BACKEND;
238 }
239 catch (...) {
240 // Any other non-standard exception
241 return PRecvStatus::BROKEN_BACKEND;
242 }
243}
static IpBusImpl * pipbus_createSocket(const std::string &connectionFilePath, const std::string &connectionId)
Creates an IpBusImpl instance.
Definition ipbrw.cpp:117
PIpBusSocket Socket
Define the socket of the backend used by the PAbstractSocketManager.
PIpBusBackend()
Default constructor of PIpBusBackend.
bool createServerSocket(Socket &socket, const PSocketParam &socketParam, const Param &param)
Create parameters for a server socket.
static void msgToMock(DataStreamMsg &mockMsg, const Message &msg)
Copy current backend message data into mock message.
static void mockToMsg(Message &msg, DataStreamMsg &mockMsg)
Copy mock message data into current backend message.
PIpBusParam Param
Define the type of extra parameters which can be used to create a Socket.
static Param client(std::string &connectionFilePath, std::string &connectionId)
Create parameters for a client socket.
bool createClientSocket(Socket &socket, const PSocketParam &socketParam, const Param &param)
Create parameters for a client socket.
static Param server(std::string &connectionFilePath, std::string &connectionId)
Create parameters for a server socket.
UaMessage Message
Define the type of message used by the PAbstractSocketManager.
PIpBusSocket()
Default constructor of PIpBusSocket.
virtual ~PIpBusSocket()
Destructor of PIpBusSocket.
PIpBusParam Param
Define the type of extra parameters which can be used to create a Socket.
bool createServerSocket(const Param &extraParam)
Create a server socket.
bool createClientSocket(const Param &extraParam)
Create a client socket.
void close()
Close the socket.
IpBusImpl * p_uaSocket
UA socket.
PSendStatus::PSendStatus sendMsg(Message &msg, PSendFlag::PSendFlag flag=PSendFlag::BLOCK)
PRecvStatus::PRecvStatus recvMsg(Message &msg, PRecvFlag::PRecvFlag flag=PRecvFlag::BLOCK)
Receive a message from the given socket.
bool isConnected() const
UaMessage Message
Define the type of message used by the PAbstractSocketManager.
std::string nodeId
Definition uaMessage.h:15
std::unique_ptr< std::vector< uint32_t > > value
Definition uaMessage.h:17
uint32_t sizeValue
Definition uaMessage.h:16
std::string connectionFilePath
Connection File Path.
std::string connectionId
Device Id.