Newer
Older
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
from ctypes import *
b2 = CDLL("libpcie40.so")
dma_reset = b2.pcie40_b2dmabufferreset
dma_read = b2.pcie40_b2dmabufferread
DMASIZE = 0x2000
nErr = 0
import os, itertools
CRC16_XMODEM_TABLE = [
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
]
def _crc16(data, crc, table):
"""Calculate CRC16 using the given table.
`data` - data for calculating CRC, must be a string
`crc` - initial value
`table` - table for caclulating CRC (list of 256 integers)
Return calculated value of CRC
"""
for byte in data:
byte1 = byte & 0xFF
byte2 = ( byte & 0xFF00 ) >> 8
crc = ((crc<<8)&0xff00) ^ table[((crc>>8)&0xff)^byte2]
crc = ((crc<<8)&0xff00) ^ table[((crc>>8)&0xff)^byte1]
return crc & 0xffff
def decode_data( dataraw , data ):
# Remove intermediate lines
datalsb = list( itertools.islice( dataraw , 0 , None , 16 ) )
datamsb = list( itertools.islice( dataraw , 8 , None , 16 ) )
# Group in 32 bit words
data += [ ( ( x & 0xFFFF ) | ( ( y & 0xFFFF ) << 8 ) ) for x, y in zip( datalsb, datamsb) ]
return 0
import socket
hname = socket.gethostname()
b2.ecs_open( 0 , 2 )
b2.ecs_open( 0 , 0 )
for nev in range( 1 ):
# Reset DMA buffer
dma_reset( 0 )
# Send trigger (adapt this line to your system)
if ( hname == 'belle2daq.local' ):
os.system( "ssh vme \"trigft -80 pulse 1 1\"" ) ### ADD this to suppress output >/dev/null 2>&1" )
else: ### KEK
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
# wait for data to arrive
size = 0
## temporisation of 2s
import time
time.sleep( 2 )
# Read DMA
dataraw = ( c_int * DMASIZE )( *range( DMASIZE ) )
data = []
data_crc = []
dma_read( 0 , dataraw )
size = decode_data( dataraw , data )
print data
print "Number of words received = {0}".format( size )
if size == 0:
print 'Not enough data read, exit'
exit( 0 )
for i in range( size / 2 + 1 ):
status, val = mem.read( 0 , 0x00050060 )
data.append( ( ( val & 0xFFFF ) << 16 ) | ( ( val & 0xFFFF0000 ) >> 16 ) )
if ( i <= size / 2 - 3) :
data_crc.append( ( val & 0xFFFF ) )
data_crc.append( ( val & 0xFFFF0000 ) >> 16 )
# Display data:
print '==================================='
print 'B2L: {0:08x}'.format(data[0])
print 'B2L: {0:08x}'.format(data[1])
print 'B2L: {0:08x}'.format(data[2])
print 'B2L: {0:08x}'.format(data[3])
print 'B2L: {0:08x}'.format(data[4])
print '-----------------------------------'
print 'FEE: data #0 {0:08x}'.format(data[5])
print 'FEE: data #1 {0:08x}'.format(data[6])
print 'FEE: ..........'
print 'FEE: data #{0} {1:08x}'.format(size/2-7,data[size/2-3])
print '-----------------------------------'
print 'B2L: {0:08x}'.format(data[size/2-2])
print 'B2L: {0:08x}'.format(data[size/2-1])
print '==================================='
print ''
print 'CRC = {0:04x}'.format(data[size/2]&0xFFFF)
print 'Computed CRC {0:04x}'.format(_crc16( data_crc, 0xffff , CRC16_XMODEM_TABLE ) )
if ( data[size/2-1]&0xFFFF ) != ( _crc16( data_crc, 0xffff , CRC16_XMODEM_TABLE ) ):
print 'Error in CRC comparison'
nErr = nErr + 1
print 'number of errors = {0}'.format( nErr )