forked from sPHENIX-Collaboration/online_distribution
/
CframeV1.C
149 lines (130 loc) · 4.03 KB
/
CframeV1.C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
** CframeV1.C
**
** Author: $Author: phnxbld $
** Date: $Date: 2009/09/19 14:34:27 $
**
** $Log: CframeV1.C,v $
** Revision 1.2 2009/09/19 14:34:27 phnxbld
** fix compiler warning
**
** Revision 1.1.1.1 2000/07/21 01:51:10 purschke
** mlp -- adding the new automakified "basic" module to CVS.
**
**
** Revision 1.3 1998/12/11 22:01:58 markacs
** (stephen markacs) adding log into cvs tags
**
*/
#include "CframeV1.h"
/*
** makeFrameHdrV1 makes a Version 1 frame header. It takes the address pointed to by
** the frame_ptr passed to it, clears the right amount of space for the header
** (sets all bytes to 0), sets the frameMark, hdrVersion, hdrLength, and
** frameLength fields to the appropriate values for an empty Version 1 header,
** sets the dataType, frameType and sourceId fields to the values passes to it,
** and copies the alignment block from the location pointed to by the
** alignment pointer passed to it.
*/
VALUE_ret makeFrameHdrV1 (PHDWORD* frame_ptr, UINT maxFrameLen, UINT dataType,
UINT frameType, UINT sourceId)
{
if (maxFrameLen < currentFrameHdrLength) return valueFailure;
dwordClear (frame_ptr, currentFrameHdrLength);
setFrameMark(frame_ptr,currentFrameMark);
setFrameHdrVersion(frame_ptr,currentFrameHdrVersion);
setFrameHdrLength(frame_ptr,currentFrameHdrLength);
setDataType(frame_ptr, dataType);
setFrameType(frame_ptr, frameType);
setSourceId(frame_ptr, sourceId);
setFrameLength(frame_ptr, V1_FRAMEHDR_LENGTH);
setFrameAlignLength(frame_ptr, V1_ALIGN_LENGTH);
return 0;
}
VALUE_ret getFrameDataLengthV1 (FRAME_ptr frame_ptr)
{
PHDWORD dataLength = getFrameLength(frame_ptr)
- getFrameHdrLength(frame_ptr)
- getFrameErrorLengthV1(frame_ptr)
- getFrameHistoryLengthV1(frame_ptr)
- getFramePaddingV1(frame_ptr) ;
if (dataLength > getFrameLength(frame_ptr) )
{
setFrameError(FORMAT_ERR_INVALID_HEADER, frame_ptr, 0);
return valueFailure;
}
else
{
setFrameSuccess();
return dataLength;
}
}
/* set bits in the frame status word */
VALUE_ret orFrameStatusV1 (FRAME_ptr frame_ptr, UINT statusBits)
{
UINT status;
/*
** Make sure intended bits fit within field length
*/
if ((statusBits & ((1<<STATUS_NUM_BITS)-1)) == statusBits)
{
status = getBitsMACRO(frame_ptr, STATUS_OFFSET_OF_DWORD,
STATUS_OFFSET_IN_DWORD, STATUS_MASK );
status|=statusBits;
setBitsMACRO(frame_ptr,
STATUS_OFFSET_OF_DWORD,
STATUS_OFFSET_IN_DWORD,
STATUS_MASK,
status );
return status;
}
else
{
setUserError (FORMAT_ERR_INVALID_DATA, statusBits);
return valueFailure;
}
}
VALUE_ret adjustFrameHistoryLengthV1 (FRAME_ptr frame_ptr, UINT newDwords)
{
UINT newLength = getFrameHistoryLengthV1(frame_ptr) + newDwords;
/*
** Make sure it fits in the current field size
*/
if (newLength > maxSwordValue)
{
setFrameError(FORMAT_ERR_HISTORY_OVERFLOW, frame_ptr, newDwords);
return valueFailure;
}
else
{
setBitsMACRO(frame_ptr,
HISTORY_LENGTH_OFFSET_OF_DWORD,
HISTORY_LENGTH_OFFSET_IN_DWORD,
HISTORY_LENGTH_MASK,
newLength );
setFrameSuccess();
return newLength;
}
}
VALUE_ret adjustFrameErrorLengthV1 (FRAME_ptr frame_ptr, UINT newDwords)
{
UINT newLength = getFrameErrorLengthV1(frame_ptr) + newDwords;
/*
** Make sure it fits in the current field size
*/
if (newLength > maxSwordValue)
{
setFrameError(FORMAT_ERR_ERROR_OVERFLOW, frame_ptr, newDwords);
return valueFailure;
}
else
{
setBitsMACRO(frame_ptr,
ERROR_LENGTH_OFFSET_OF_DWORD,
ERROR_LENGTH_OFFSET_IN_DWORD,
ERROR_LENGTH_MASK,
newLength );
setFrameSuccess();
return newLength;
}
}