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