1. Ctb transceiver ro (#773)

*  transceiverenable, tsamples, romode for tranceiver and digital_transceiver

* 202 spec instr only for transceiver mode

* removed check for empty in trans readout and clean memory before reading from fifo

* ctb read fifo strobe for all after reading all channels, adding 1us after selecting channel, changing fw date

* updated 10gb transceiver enable

----
* added transceiver (tsamples, romode(transceiver, digital_transceiver), transceiverenable (mask)

* clean memory before reading from fifo (for analog and digital as well)

* read fifo then read strobe (also corresp fw) fixes number of reads (also for analg and digital)-> increases all pipelines by 1

* fixed bug in rearranging digital data in receiver

* fixed bug in streaming size of data after rearranging

* fixed bug in setbit, clearbit,and getbit

* status checks fifo before returning idle (transmitting if data in fifo if transceiver more enabled)

* soem matterhorn specifics that will need to be put into pattern in a month or two. this is temporary.

* NOTE: breaking api. rxParameters struct has transceiverenabel and tsamples given from det to receiver
This commit is contained in:
2023-07-14 16:29:21 +02:00
committed by GitHub
parent a56be25500
commit c628ae2192
30 changed files with 1118 additions and 238 deletions

View File

@ -21,11 +21,14 @@ extern const enum detectorType myDetectorType;
extern int analogDataBytes;
extern int digitalDataBytes;
extern int transceiverDataBytes;
extern char *analogData;
extern char *digitalData;
extern char *transceiverData;
int analogOffset = 0;
int digitalOffset = 0;
int transceiverOffset = 0;
uint32_t udpPacketNumber = 0;
uint64_t udpFrameNumber = 0;
@ -51,27 +54,30 @@ void createUDPPacketHeader(char *buffer, uint16_t id) {
// reset offset
analogOffset = 0;
digitalOffset = 0;
transceiverOffset = 0;
// reset frame number
udpFrameNumber = 0;
}
int fillUDPPacket(char *buffer) {
LOG(logDEBUG2,
("Analog (databytes:%d, offset:%d)\n Digital (databytes:%d "
"offset:%d)\n",
analogDataBytes, analogOffset, digitalDataBytes, digitalOffset));
LOG(logDEBUG2, ("Analog (databytes:%d, offset:%d)\n Digital (databytes:%d "
"offset:%d)\n\n Transceiver (databytes:%d offset:%d)\n",
analogDataBytes, analogOffset, digitalDataBytes,
digitalOffset, transceiverDataBytes, transceiverOffset));
// reached end of data for one frame
if (analogOffset >= analogDataBytes && digitalOffset >= digitalDataBytes) {
if (analogOffset >= analogDataBytes && digitalOffset >= digitalDataBytes &&
transceiverOffset >= transceiverDataBytes) {
// reset offset
analogOffset = 0;
digitalOffset = 0;
transceiverOffset = 0;
return 0;
}
sls_detector_header *header = (sls_detector_header *)(buffer);
// update frame number, starts at 1 (reset packet number)
if (analogOffset == 0 && digitalOffset == 0) {
if (analogOffset == 0 && digitalOffset == 0 && transceiverOffset == 0) {
++udpFrameNumber;
header->frameNumber = udpFrameNumber;
udpPacketNumber = -1;
@ -117,10 +123,28 @@ int fillUDPPacket(char *buffer) {
freeBytes -= digitalBytes;
}
// transceiver data
int transceiverBytes = 0;
if (freeBytes && transceiverOffset < transceiverDataBytes) {
// bytes to copy
transceiverBytes =
((transceiverOffset + freeBytes) <= transceiverDataBytes)
? freeBytes
: (transceiverDataBytes - transceiverOffset);
// copy
memcpy(buffer + sizeof(sls_detector_header) + analogBytes +
digitalBytes,
transceiverData + transceiverOffset, transceiverBytes);
// increment offset
transceiverOffset += transceiverBytes;
// decrement free bytes
freeBytes -= transceiverBytes;
}
// pad data
if (freeBytes) {
memset(buffer + sizeof(sls_detector_header) + analogBytes +
digitalBytes,
digitalBytes + transceiverBytes,
0, freeBytes);
LOG(logDEBUG1, ("Padding %d bytes for fnum:%lld pnum:%d\n", freeBytes,
(long long int)udpFrameNumber, udpPacketNumber));