@@ -368,6 +368,9 @@ func (dev *Device) initFPGA() error {
368
368
369
369
dev .msg .Printf ("trigger mode: %v" , dev .cfg .daq .mode )
370
370
switch dev .cfg .daq .mode {
371
+ default :
372
+ return fmt .Errorf ("eda: invalid trigger mode: %v" , dev .cfg .daq .mode )
373
+
371
374
case "dcc" :
372
375
err = dev .syncSelectCmdDCC ()
373
376
if err != nil {
@@ -381,14 +384,40 @@ func (dev *Device) initFPGA() error {
381
384
if err != nil {
382
385
return fmt .Errorf ("eda: could not enable DCC RAM-full: %w" , err )
383
386
}
387
+
384
388
case "noise" :
385
389
err = dev .syncSelectCmdSoft ()
386
390
if err != nil {
387
391
return fmt .Errorf ("eda: could not select SOFT cmd: %w" , err )
388
392
}
389
393
390
- default :
391
- return fmt .Errorf ("eda: invalid trigger mode: %v" , dev .cfg .daq .mode )
394
+ case "inj" :
395
+ // set injector DAC
396
+ const injDAC = 100
397
+ dev .msg .Printf ("setting injector DAC with value %d" , injDAC )
398
+ for _ , rfm := range dev .rfms {
399
+ dev .msg .Printf ("rfm %d..." , rfm )
400
+ err = dev .injDACSelect (rfm )
401
+ if err != nil {
402
+ return fmt .Errorf (
403
+ "eda: could select injector DAC for rfm=%d: %w" ,
404
+ rfm , err ,
405
+ )
406
+ }
407
+
408
+ err = dev .injDACSet (rfm , injDAC )
409
+ if err != nil {
410
+ return fmt .Errorf (
411
+ "eda: could not set injector DAC for rfm=%d: %w" ,
412
+ rfm , err ,
413
+ )
414
+ }
415
+ }
416
+
417
+ err = dev .syncSelectCmdSoft ()
418
+ if err != nil {
419
+ return fmt .Errorf ("eda: could not select SOFT cmd: %w" , err )
420
+ }
392
421
}
393
422
394
423
return nil
@@ -408,6 +437,18 @@ func (dev *Device) initHRFromDB() error {
408
437
dev .hrscSetRShaper (0 , dev .cfg .hr .rshaper )
409
438
dev .hrscSetCShaper (0 , dev .cfg .hr .cshaper )
410
439
440
+ if dev .cfg .mode == "inj" {
441
+ dev .hrscSetCtest (0 , 31 , 1 )
442
+ dev .hrscSetCtest (1 , 31 , 1 )
443
+ dev .hrscSetCtest (2 , 31 , 1 )
444
+ dev .hrscSetCtest (3 , 31 , 1 )
445
+ dev .hrscSetCtest (4 , 31 , 1 )
446
+ dev .hrscSetCtest (5 , 31 , 1 )
447
+ dev .hrscSetCtest (6 , 31 , 1 )
448
+ dev .hrscSetCtest (7 , 31 , 1 )
449
+ dev .hrscSetCtest (8 , 31 , 1 )
450
+ }
451
+
411
452
// set chip IDs
412
453
for hr := uint32 (0 ); hr < nHR ; hr ++ {
413
454
dev .hrscSetChipID (hr , hr + 1 )
@@ -594,6 +635,8 @@ func (dev *Device) Start(run uint32) error {
594
635
return dev .startRunDCC (run )
595
636
case "noise" :
596
637
return dev .startRunNoise (run )
638
+ case "inj" :
639
+ return dev .startRunInj (run )
597
640
default :
598
641
err := fmt .Errorf ("eda: unknown trig-mode %q" , dev .cfg .daq .mode )
599
642
dev .msg .Printf ("%+v" , err )
@@ -695,6 +738,47 @@ func (dev *Device) startRunNoise(run uint32) error {
695
738
return nil
696
739
}
697
740
741
+ func (dev * Device ) startRunInj (run uint32 ) error {
742
+ var err error
743
+
744
+ err = dev .injStartCTestPulser (25000 , 0 ) // 100Hz
745
+ if err != nil {
746
+ return fmt .Errorf ("eda: could not start ctest pulser: %w" , err )
747
+ }
748
+
749
+ for _ , rfm := range dev .rfms {
750
+ err = dev .daqFIFOInit (rfm )
751
+ if err != nil {
752
+ return fmt .Errorf ("eda: could not initialize DAQ FIFO (RFM=%d): %w" , rfm , err )
753
+ }
754
+ }
755
+
756
+ err = dev .cntReset ()
757
+ if err != nil {
758
+ return fmt .Errorf ("eda: could not reset counters: %w" , err )
759
+ }
760
+
761
+ err = dev .syncResetBCID ()
762
+ if err != nil {
763
+ return fmt .Errorf ("eda: could not reset BCID: %w" , err )
764
+ }
765
+
766
+ err = dev .syncStart ()
767
+ if err != nil {
768
+ return fmt .Errorf ("eda: could not start acquisition: %w" , err )
769
+ }
770
+
771
+ err = dev .syncArmFIFO ()
772
+ if err != nil {
773
+ return fmt .Errorf ("eda: could not arm FIFO: %w" , err )
774
+ }
775
+
776
+ dev .daq .done = make (chan int )
777
+
778
+ go dev .loop ()
779
+ return nil
780
+ }
781
+
698
782
func (dev * Device ) initRun (run uint32 ) error {
699
783
// save run-dependant settings
700
784
dev .msg .Printf (
@@ -769,6 +853,8 @@ func (dev *Device) loop() {
769
853
dev .loopDCC ()
770
854
case "noise" :
771
855
dev .loopNoise ()
856
+ case "inj" :
857
+ dev .loopInj ()
772
858
default :
773
859
err := fmt .Errorf ("eda: invalid trig-mode %q" , dev .cfg .daq .mode )
774
860
panic (err )
@@ -998,6 +1084,126 @@ func (dev *Device) loopNoise() {
998
1084
}
999
1085
}
1000
1086
1087
+ func (dev * Device ) loopInj () {
1088
+ var (
1089
+ w = dev .msg .Writer ()
1090
+ printf = fmt .Fprintf
1091
+ errorf = func (format string , args ... interface {}) {
1092
+ dev .err = fmt .Errorf (format , args ... )
1093
+ dev .msg .Printf ("%+v" , dev .err )
1094
+ }
1095
+ cycle int
1096
+ err error
1097
+ )
1098
+
1099
+ if len (dev .daq .rfm ) != 0 {
1100
+ for i := range dev .daq .rfm {
1101
+ rfm := & dev .daq .rfm [i ]
1102
+ if ! rfm .valid () {
1103
+ continue
1104
+ }
1105
+ defer rfm .sck .Close ()
1106
+ }
1107
+ }
1108
+
1109
+ for i := range dev .daq .rfm {
1110
+ rfm := & dev .daq .rfm [i ]
1111
+ rfm .w = & wbuf {
1112
+ p : make ([]byte , daqBufferSize ),
1113
+ }
1114
+ }
1115
+
1116
+ for {
1117
+ printf (w , "trigger %07d, state: acq-" , cycle )
1118
+ // wait until readout is done
1119
+ readout:
1120
+ for {
1121
+ state := dev .syncState ()
1122
+ switch {
1123
+ case state >= regs .S_RAMFULL :
1124
+ break readout
1125
+ default :
1126
+ select {
1127
+ case <- dev .daq .done :
1128
+ dev .daq .done <- 1
1129
+ return
1130
+ default :
1131
+ }
1132
+ }
1133
+ }
1134
+ printf (w , "ramfull-" )
1135
+ err = dev .syncRAMFullExt ()
1136
+ if err != nil {
1137
+ errorf ("could not set RAMFULL: %+v" , err )
1138
+ return
1139
+ }
1140
+
1141
+ dataReady:
1142
+ for {
1143
+ state := dev .syncState ()
1144
+ switch {
1145
+ case state >= regs .S_FIFO_READY :
1146
+ break dataReady
1147
+ default :
1148
+ select {
1149
+ case <- dev .daq .done :
1150
+ dev .daq .done <- 1
1151
+ return
1152
+ default :
1153
+ }
1154
+ }
1155
+ }
1156
+
1157
+ printf (w , "cp-" ) // copy
1158
+
1159
+ // read hardroc data
1160
+ for i , rfm := range dev .rfms {
1161
+ dev .daqWriteDIFData (dev .daq .rfm [i ].w , rfm )
1162
+ }
1163
+ err = dev .syncAckFIFO ()
1164
+ if err != nil {
1165
+ errorf ("eda: could not ACK FIFO: %w" , err )
1166
+ return
1167
+ }
1168
+ printf (w , "tx-" )
1169
+ var grp errgroup.Group
1170
+ for i := range dev .daq .rfm {
1171
+ if ! dev .daq .rfm [i ].valid () {
1172
+ continue
1173
+ }
1174
+ ii := i
1175
+ grp .Go (func () error {
1176
+ err := dev .daqSendDIFData (ii )
1177
+ if err != nil {
1178
+ errorf ("eda: could not send DIF data (RFM=%d): %w" , dev .rfms [ii ], err )
1179
+ return err
1180
+ }
1181
+ return nil
1182
+ })
1183
+ }
1184
+ err = grp .Wait ()
1185
+ if err != nil {
1186
+ errorf ("eda: could not send DIF data: %w" , err )
1187
+ return
1188
+ }
1189
+
1190
+ printf (w , "\n " )
1191
+ cycle ++
1192
+
1193
+ select {
1194
+ case <- dev .daq .done :
1195
+ dev .daq .done <- 1
1196
+ return
1197
+ default :
1198
+ err = dev .syncStart ()
1199
+ if err != nil {
1200
+ errorf ("eda: could not start acquisition: %w" , err )
1201
+ return
1202
+ }
1203
+ }
1204
+ }
1205
+ }
1206
+
1001
1207
func (dev * Device ) Stop () error {
1002
1208
const timeout = 10 * time .Second
1003
1209
tck := time .NewTimer (timeout )
@@ -1030,6 +1236,19 @@ func (dev *Device) Stop() error {
1030
1236
if err != nil {
1031
1237
return fmt .Errorf ("eda: could not stop counters: %w" , err )
1032
1238
}
1239
+ case "inj" :
1240
+ err = dev .syncStop ()
1241
+ if err != nil {
1242
+ return fmt .Errorf ("eda: could not stop acquisition: %w" , err )
1243
+ }
1244
+ err = dev .cntStop ()
1245
+ if err != nil {
1246
+ return fmt .Errorf ("eda: could not stop counters: %w" , err )
1247
+ }
1248
+ err = dev .injStopCTestPulser ()
1249
+ if err != nil {
1250
+ return fmt .Errorf ("eda: could not stop ctest pulser: %w" , err )
1251
+ }
1033
1252
}
1034
1253
1035
1254
err = dev .cntReset ()
0 commit comments