1 #include "otsdaq-components/DAQHardware/PurdueFirmwareCore.h"
2 #include "otsdaq-core/BitManipulator/BitManipulator.h"
3 #include "otsdaq-components/DAQHardware/FirmwareBaseDefinitions.h"
4 #include "otsdaq-core/MessageFacility/MessageFacility.h"
5 #include "otsdaq-core/Macros/CoutMacros.h"
6 #include <sys/socket.h>
7 #include <netinet/in.h>
15 PurdueFirmwareCore::PurdueFirmwareCore(
unsigned int version):
21 PurdueFirmwareCore::~PurdueFirmwareCore(
void)
25 void PurdueFirmwareCore::init(
void)
29 void PurdueFirmwareCore::setDataDestination(std::string& buffer,
30 const std::string& ipAddress,
const uint16_t port,
bool clearBuffer)
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, uint32_t address, uint32_t data,
bool clearBuffer)
61 unsigned int begin = buffer.length();
62 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
63 buffer.resize(buffer.length() + 12,
'\0');
66 buffer[begin + 0] = numberOfBufferedCommands + 1;
67 buffer[begin + 1] = WRITE;
68 buffer[begin + 2] = 0;
69 buffer[begin + 3] = 8;
70 buffer[begin + 4] = (address >> 24) & 0xff;
71 buffer[begin + 5] = (address >> 16) & 0xff;
72 buffer[begin + 6] = (address >> 8) & 0xff;
73 buffer[begin + 7] = address & 0xff;
74 buffer[begin + 8] = (data >> 24) & 0xff;
75 buffer[begin + 9] = (data >> 16) & 0xff;
76 buffer[begin + 10] = (data >> 8) & 0xff;
77 buffer[begin + 11] = data & 0xff;
84 void PurdueFirmwareCore::waitSet(std::string& buffer, uint32_t address, uint32_t data, uint32_t timeout,
bool clearBuffer)
89 unsigned int begin = buffer.length();
90 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
91 buffer.resize(buffer.length() + 16,
'\0');
94 buffer[begin + 0] = numberOfBufferedCommands + 1;
95 buffer[begin + 1] = WAITSET;
96 buffer[begin + 2] = 0;
97 buffer[begin + 3] = 12;
98 buffer[begin + 4] = (address >> 24) & 0xff;
99 buffer[begin + 5] = (address >> 16) & 0xff;
100 buffer[begin + 6] = (address >> 8) & 0xff;
101 buffer[begin + 7] = address & 0xff;
102 buffer[begin + 8] = (data >> 24) & 0xff;
103 buffer[begin + 9] = (data >> 16) & 0xff;
104 buffer[begin + 10] = (data >> 8) & 0xff;
105 buffer[begin + 11] = data & 0xff;
106 buffer[begin + 12] = (timeout >> 24) & 0xff;
107 buffer[begin + 13] = (timeout >> 16) & 0xff;
108 buffer[begin + 14] = (timeout >> 8) & 0xff;
109 buffer[begin + 15] = timeout & 0xff;
116 void PurdueFirmwareCore::waitClear(std::string& buffer, uint32_t address, uint32_t data, uint32_t timeout,
bool clearBuffer)
121 unsigned int begin = buffer.length();
122 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
123 buffer.resize(buffer.length() + 16,
'\0');
126 buffer[begin + 0] = numberOfBufferedCommands + 1;
127 buffer[begin + 1] = WAITCLR;
128 buffer[begin + 2] = 0;
129 buffer[begin + 3] = 12;
130 buffer[begin + 4] = (address >> 24) & 0xff;
131 buffer[begin + 5] = (address >> 16) & 0xff;
132 buffer[begin + 6] = (address >> 8) & 0xff;
133 buffer[begin + 7] = address & 0xff;
134 buffer[begin + 8] = (data >> 24) & 0xff;
135 buffer[begin + 9] = (data >> 16) & 0xff;
136 buffer[begin + 10] = (data >> 8) & 0xff;
137 buffer[begin + 11] = data & 0xff;
138 buffer[begin + 12] = (timeout >> 24) & 0xff;
139 buffer[begin + 13] = (timeout >> 16) & 0xff;
140 buffer[begin + 14] = (timeout >> 8) & 0xff;
141 buffer[begin + 15] = timeout & 0xff;
148 void PurdueFirmwareCore::read(std::string& buffer, uint32_t address,
bool clearBuffer)
153 unsigned int begin = buffer.length();
154 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer);
155 buffer.resize(buffer.length() + 8,
'\0');
158 buffer[begin + 0] = numberOfBufferedCommands + 1;
159 buffer[begin + 1] = READ;
160 buffer[begin + 2] = 0;
161 buffer[begin + 3] = 4;
162 buffer[begin + 4] = (address >> 24) & 0xff;
163 buffer[begin + 5] = (address >> 16) & 0xff;
164 buffer[begin + 6] = (address >> 8) & 0xff;
165 buffer[begin + 7] = address & 0xff;
172 unsigned int PurdueFirmwareCore::getNumberOfBufferedCommands(std::string& buffer)
174 if (buffer.length() == 0)
176 unsigned int bufferPosition = 0;
177 unsigned int commandNumber = 0;
178 while (bufferPosition < buffer.length() - 1)
180 bufferPosition += (
unsigned int) buffer[bufferPosition + 3] + 4;
183 return commandNumber;
187 std::string PurdueFirmwareCore::compareSendAndReceive(
const std::string& sentBuffer, std::string& acknowledgment)
189 std::string reSendBuffer;
190 unsigned int skipBuffer = 0;
191 unsigned int skipAcknow = 0;
192 unsigned int remainBufferCommands;
193 unsigned int remainAcknowCommands;
195 std::cout << __COUT_HDR_FL__ <<
"Comparing sent buffer and received acknowledgment!!!" << std::endl;
197 std::cout << __COUT_HDR_FL__ <<
"Buffer size (send): " << sentBuffer.size() << std::endl;
198 std::cout << __COUT_HDR_FL__ <<
"Acknowledgment size (receive): " << acknowledgment.size() << std::endl;
200 while(skipBuffer < sentBuffer.size())
203 for (
int position = 0; position < 4; position++)
205 if (position + skipBuffer >= sentBuffer.size())
207 reSendBuffer.clear();
208 std::cout << __COUT_HDR_FL__ <<
"Done... Works!!!" << std::endl;
214 if (sentBuffer[position + skipBuffer] != acknowledgment[position + skipAcknow])
216 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent " << position + skipBuffer <<
"th: " << std::hex << (
unsigned int)sentBuffer[position + skipBuffer] << std::dec
217 <<
" different from Received " << position + skipAcknow <<
"th:"
218 << std::hex << (
unsigned int)acknowledgment[position + skipAcknow] << std::dec;
219 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
220 reSendBuffer.clear();
221 for (
unsigned int i = skipBuffer; i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); i++)
223 reSendBuffer+= sentBuffer[i];
231 if ( (sentBuffer[position + skipBuffer]) != (acknowledgment[position + skipAcknow] & 0xf) )
233 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent " << position + skipBuffer <<
"th: " << std::hex << (
unsigned int)sentBuffer[position + skipBuffer] << std::dec
234 <<
" different from Received " << position + skipAcknow <<
"th:"
235 << std::hex << (
unsigned int)acknowledgment[position + skipAcknow] << std::dec;
236 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
237 reSendBuffer.clear();
238 for (
unsigned int i = skipBuffer; i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); i++)
240 reSendBuffer+= sentBuffer[i];
248 if ( (sentBuffer[position + skipBuffer] != 0) || (acknowledgment[position + skipAcknow] != 0) )
250 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent " << position + skipBuffer <<
"th: " << std::hex << (
unsigned int)sentBuffer[position + skipBuffer] << std::dec
251 <<
" different from Received " << position + skipAcknow <<
"th:"
252 << std::hex << (
unsigned int)acknowledgment[position + skipAcknow] << std::dec << std::endl;
253 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
254 reSendBuffer.clear();
255 for (
unsigned int i = skipBuffer; i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); i++)
257 reSendBuffer+= sentBuffer[i];
265 remainBufferCommands = sentBuffer[position + skipBuffer];
266 remainAcknowCommands = acknowledgment[position + skipAcknow];
268 if ( ((remainBufferCommands == 12) && (remainAcknowCommands == 4)) || ((remainBufferCommands == 8) && (remainAcknowCommands == 0)) )
270 skipBuffer += (4 + remainBufferCommands);
271 skipAcknow += (4 + remainAcknowCommands);
275 std::cout << __COUT_HDR_FL__ <<
"ERROR - Sent " << position + skipBuffer <<
"th: " << std::hex << (
unsigned int)sentBuffer[position + skipBuffer] << std::dec
276 <<
" not compatible with Received " << position + skipAcknow <<
"th:"
277 << std::hex << (
unsigned int)acknowledgment[position + skipAcknow] << std::dec << std::endl;
278 std::cout << __COUT_HDR_FL__ <<
"Position: " << position << std::endl;
279 reSendBuffer.clear();
280 for (
unsigned int i = skipBuffer; i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); i++)
282 reSendBuffer+= sentBuffer[i];
290 reSendBuffer.clear();
291 std::cout << __COUT_HDR_FL__ <<
"Done... Works!!!" << std::endl;
296 uint32_t PurdueFirmwareCore::createRegisterFromValue(std::string& readBuffer, std::string& receivedValue)
298 for (
int position = 0; position < 8; position++)
300 if (position == 0 || position == 4 || position == 5 || position == 6 || position == 7)
302 if (readBuffer[position] != receivedValue[position])
304 std::cout << __COUT_HDR_FL__
305 <<
"ERROR - SentBuffer position " << position <<
" value: " << std::hex << (
unsigned int)readBuffer[position] << std::dec
306 <<
" different from ReceivedBuffer position " << position <<
" value: " << std::hex << (
unsigned int)receivedValue[position] << std::dec
314 if ( (readBuffer[position] != (receivedValue[position] & 0xf)) )
316 std::cout << __COUT_HDR_FL__
317 <<
"ERROR - SentBuffer position " << position <<
" value: " << std::hex << (
unsigned int)readBuffer[position] << std::dec
318 <<
" different from ReceivedBuffer position " << position <<
" value: " << std::hex << (
unsigned int)receivedValue[position] << std::dec
326 if ( (readBuffer[position] != 0) || (receivedValue[position] != 0) )
328 std::cout << __COUT_HDR_FL__
329 <<
"ERROR - SentBuffer position " << position <<
" value: " << std::hex << (
unsigned int)readBuffer[position] << std::dec
330 <<
" different from ReceivedBuffer position " << position <<
" value: " << std::hex << (
unsigned int)receivedValue[position] << std::dec
338 if ( (readBuffer[position] != 4) || (receivedValue[position] != 8) )
340 std::cout << __COUT_HDR_FL__
341 <<
"ERROR - SentBuffer position " << position <<
" value: " << std::hex << (
unsigned int)readBuffer[position] << std::dec
342 <<
" different from ReceivedBuffer position " << position <<
" value: " << std::hex << (
unsigned int)receivedValue[position] << std::dec
349 uint32_t registerValue;
351 registerValue = ((
unsigned int)receivedValue[8] << 24)
352 + ((
unsigned int)receivedValue[9] << 16)
353 + ((
unsigned int)receivedValue[10] << 8)
354 + (
unsigned int)receivedValue[11];
356 std::cout << __COUT_HDR_FL__ <<
"No problem encountered! Register value created!!! " << std::endl;
358 return registerValue;