1 #include "otsdaq-components/DAQHardware/PurdueFirmwareCore.h"
3 #include <netinet/in.h>
4 #include <sys/socket.h>
7 #include "otsdaq-components/DAQHardware/FirmwareBaseDefinitions.h"
8 #include "otsdaq/BitManipulator/BitManipulator.h"
9 #include "otsdaq/Macros/CoutMacros.h"
10 #include "otsdaq/MessageFacility/MessageFacility.h"
15 PurdueFirmwareCore::PurdueFirmwareCore(
unsigned int version)
21 PurdueFirmwareCore::~PurdueFirmwareCore(
void) {}
24 void PurdueFirmwareCore::init(
void) {}
27 void PurdueFirmwareCore::setDataDestination(std::string& buffer,
28 const std::string& ipAddress,
39 std::string PurdueFirmwareCore::read(
char* address)
42 read(buffer, *(uint32_t*)address);
47 std::string PurdueFirmwareCore::write(
char* address,
char* data)
50 write(buffer, *(uint32_t*)address, *(uint32_t*)data);
55 void PurdueFirmwareCore::write(std::string& buffer,
64 unsigned int begin = buffer.length();
65 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
66 buffer.resize(buffer.length() + 12,
'\0');
69 buffer[begin + 0] = numberOfBufferedCommands + 1;
70 buffer[begin + 1] = WRITE;
71 buffer[begin + 2] = 0;
72 buffer[begin + 3] = 8;
73 buffer[begin + 4] = (address >> 24) & 0xff;
74 buffer[begin + 5] = (address >> 16) & 0xff;
75 buffer[begin + 6] = (address >> 8) & 0xff;
76 buffer[begin + 7] = address & 0xff;
77 buffer[begin + 8] = (data >> 24) & 0xff;
78 buffer[begin + 9] = (data >> 16) & 0xff;
79 buffer[begin + 10] = (data >> 8) & 0xff;
80 buffer[begin + 11] = data & 0xff;
87 void PurdueFirmwareCore::waitSet(std::string& buffer,
96 unsigned int begin = buffer.length();
97 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
98 buffer.resize(buffer.length() + 16,
'\0');
101 buffer[begin + 0] = numberOfBufferedCommands + 1;
102 buffer[begin + 1] = WAITSET;
103 buffer[begin + 2] = 0;
104 buffer[begin + 3] = 12;
105 buffer[begin + 4] = (address >> 24) & 0xff;
106 buffer[begin + 5] = (address >> 16) & 0xff;
107 buffer[begin + 6] = (address >> 8) & 0xff;
108 buffer[begin + 7] = address & 0xff;
109 buffer[begin + 8] = (data >> 24) & 0xff;
110 buffer[begin + 9] = (data >> 16) & 0xff;
111 buffer[begin + 10] = (data >> 8) & 0xff;
112 buffer[begin + 11] = data & 0xff;
113 buffer[begin + 12] = (timeout >> 24) & 0xff;
114 buffer[begin + 13] = (timeout >> 16) & 0xff;
115 buffer[begin + 14] = (timeout >> 8) & 0xff;
116 buffer[begin + 15] = timeout & 0xff;
123 void PurdueFirmwareCore::waitClear(std::string& buffer,
132 unsigned int begin = buffer.length();
133 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
134 buffer.resize(buffer.length() + 16,
'\0');
137 buffer[begin + 0] = numberOfBufferedCommands + 1;
138 buffer[begin + 1] = WAITCLR;
139 buffer[begin + 2] = 0;
140 buffer[begin + 3] = 12;
141 buffer[begin + 4] = (address >> 24) & 0xff;
142 buffer[begin + 5] = (address >> 16) & 0xff;
143 buffer[begin + 6] = (address >> 8) & 0xff;
144 buffer[begin + 7] = address & 0xff;
145 buffer[begin + 8] = (data >> 24) & 0xff;
146 buffer[begin + 9] = (data >> 16) & 0xff;
147 buffer[begin + 10] = (data >> 8) & 0xff;
148 buffer[begin + 11] = data & 0xff;
149 buffer[begin + 12] = (timeout >> 24) & 0xff;
150 buffer[begin + 13] = (timeout >> 16) & 0xff;
151 buffer[begin + 14] = (timeout >> 8) & 0xff;
152 buffer[begin + 15] = timeout & 0xff;
159 void PurdueFirmwareCore::read(std::string& buffer, uint32_t address,
bool clearBuffer)
164 unsigned int begin = buffer.length();
165 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
166 buffer.resize(buffer.length() + 8,
'\0');
169 buffer[begin + 0] = numberOfBufferedCommands + 1;
170 buffer[begin + 1] = READ;
171 buffer[begin + 2] = 0;
172 buffer[begin + 3] = 4;
173 buffer[begin + 4] = (address >> 24) & 0xff;
174 buffer[begin + 5] = (address >> 16) & 0xff;
175 buffer[begin + 6] = (address >> 8) & 0xff;
176 buffer[begin + 7] = address & 0xff;
183 unsigned int PurdueFirmwareCore::getNumberOfBufferedCommands(std::string& buffer)
185 if(buffer.length() == 0)
187 unsigned int bufferPosition = 0;
188 unsigned int commandNumber = 0;
189 while(bufferPosition < buffer.length() - 1)
191 bufferPosition += (
unsigned int)buffer[bufferPosition + 3] + 4;
194 return commandNumber;
198 std::string PurdueFirmwareCore::compareSendAndReceive(
const std::string& sentBuffer,
199 std::string& acknowledgment)
201 std::string reSendBuffer;
202 unsigned int skipBuffer = 0;
203 unsigned int skipAcknow = 0;
204 unsigned int remainBufferCommands;
205 unsigned int remainAcknowCommands;
207 std::cout << __COUT_HDR_FL__ <<
"Comparing sent buffer and received acknowledgment!!!"
210 std::cout << __COUT_HDR_FL__ <<
"Buffer size (send): " << sentBuffer.size()
212 std::cout << __COUT_HDR_FL__
213 <<
"Acknowledgment size (receive): " << acknowledgment.size() << std::endl;
215 while(skipBuffer < sentBuffer.size())
217 for(
int position = 0; position < 4; position++)
219 if(position + skipBuffer >=
222 reSendBuffer.clear();
223 std::cout << __COUT_HDR_FL__ <<
"Done... Works!!!" << std::endl;
229 if(sentBuffer[position + skipBuffer] !=
230 acknowledgment[position + skipAcknow])
232 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent "
233 << position + skipBuffer <<
"th: " << std::hex
234 << (
unsigned int)sentBuffer[position + skipBuffer]
235 << std::dec <<
" different from Received "
236 << position + skipAcknow <<
"th:" << std::hex
237 << (
unsigned int)acknowledgment[position + skipAcknow]
239 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
240 reSendBuffer.clear();
241 for(
unsigned int i = skipBuffer;
242 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]);
245 reSendBuffer += sentBuffer[i];
253 if((sentBuffer[position + skipBuffer]) !=
254 (acknowledgment[position + skipAcknow] & 0xf))
256 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent "
257 << position + skipBuffer <<
"th: " << std::hex
258 << (
unsigned int)sentBuffer[position + skipBuffer]
259 << std::dec <<
" different from Received "
260 << position + skipAcknow <<
"th:" << std::hex
261 << (
unsigned int)acknowledgment[position + skipAcknow]
263 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
264 reSendBuffer.clear();
265 for(
unsigned int i = skipBuffer;
266 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]);
269 reSendBuffer += sentBuffer[i];
277 if((sentBuffer[position + skipBuffer] != 0) ||
278 (acknowledgment[position + skipAcknow] != 0))
280 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent "
281 << position + skipBuffer <<
"th: " << std::hex
282 << (
unsigned int)sentBuffer[position + skipBuffer]
283 << std::dec <<
" different from Received "
284 << position + skipAcknow <<
"th:" << std::hex
285 << (
unsigned int)acknowledgment[position + skipAcknow]
286 << std::dec << std::endl;
287 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
288 reSendBuffer.clear();
289 for(
unsigned int i = skipBuffer;
290 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]);
293 reSendBuffer += sentBuffer[i];
301 remainBufferCommands =
302 sentBuffer[position +
304 remainAcknowCommands = acknowledgment[position + skipAcknow];
306 if(((remainBufferCommands == 12) && (remainAcknowCommands == 4)) ||
307 ((remainBufferCommands == 8) && (remainAcknowCommands == 0)))
310 (4 + remainBufferCommands);
311 skipAcknow += (4 + remainAcknowCommands);
315 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent "
316 << position + skipBuffer <<
"th: " << std::hex
317 << (
unsigned int)sentBuffer[position + skipBuffer]
318 << std::dec <<
" not compatible with Received "
319 << position + skipAcknow <<
"th:" << std::hex
320 << (
unsigned int)acknowledgment[position + skipAcknow]
321 << std::dec << std::endl;
322 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
323 reSendBuffer.clear();
324 for(
unsigned int i = skipBuffer;
325 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]);
328 reSendBuffer += sentBuffer[i];
336 reSendBuffer.clear();
337 std::cout << __COUT_HDR_FL__ <<
"Done... Works!!!" << std::endl;
342 uint32_t PurdueFirmwareCore::createRegisterFromValue(std::string& readBuffer,
343 std::string& receivedValue)
345 for(
int position = 0; position < 8; position++)
347 if(position == 0 || position == 4 || position == 5 || position == 6 ||
350 if(readBuffer[position] != receivedValue[position])
352 std::cout << __COUT_HDR_FL__ <<
"ERROR - SentBuffer position " << position
353 <<
" value: " << std::hex << (
unsigned int)readBuffer[position]
354 << std::dec <<
" different from ReceivedBuffer position "
355 << position <<
" value: " << std::hex
356 << (
unsigned int)receivedValue[position] << std::dec
364 if((readBuffer[position] != (receivedValue[position] & 0xf)))
366 std::cout << __COUT_HDR_FL__ <<
"ERROR - SentBuffer position " << position
367 <<
" value: " << std::hex << (
unsigned int)readBuffer[position]
368 << std::dec <<
" different from ReceivedBuffer position "
369 << position <<
" value: " << std::hex
370 << (
unsigned int)receivedValue[position] << std::dec
378 if((readBuffer[position] != 0) || (receivedValue[position] != 0))
380 std::cout << __COUT_HDR_FL__ <<
"ERROR - SentBuffer position " << position
381 <<
" value: " << std::hex << (
unsigned int)readBuffer[position]
382 << std::dec <<
" different from ReceivedBuffer position "
383 << position <<
" value: " << std::hex
384 << (
unsigned int)receivedValue[position] << std::dec
392 if((readBuffer[position] != 4) || (receivedValue[position] != 8))
394 std::cout << __COUT_HDR_FL__ <<
"ERROR - SentBuffer position " << position
395 <<
" value: " << std::hex << (
unsigned int)readBuffer[position]
396 << std::dec <<
" different from ReceivedBuffer position "
397 << position <<
" value: " << std::hex
398 << (
unsigned int)receivedValue[position] << std::dec
405 uint32_t registerValue;
408 ((
unsigned int)receivedValue[8] << 24) + ((
unsigned int)receivedValue[9] << 16) +
409 ((
unsigned int)receivedValue[10] << 8) + (
unsigned int)receivedValue[11];
411 std::cout << __COUT_HDR_FL__ <<
"No problem encountered! Register value created!!! "
414 return registerValue;