AlcapDAQ  1
Functions | Variables
rpc_slave_x.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/time.h>
#include "midas.h"
#include "crate.h"
#include "diag.h"
#include "odb_wrapper.h"
#include "rpc_mucap.h"

Go to the source code of this file.

Functions

INT rpc_end_of_cycle (INT index, void *prpc_param[])
 
INT rpc_slave_init ()
 
INT rpc_slave_bor ()
 
INT rpc_slave_eor ()
 
INT rpc_slave_poll_live ()
 
INT rpc_slave_poll_dead ()
 
INT rpc_slave_stop_block ()
 
INT rpc_slave_read (char *pevent)
 
INT send_ready_for_cycle ()
 

Variables

static HNDLE rpc_conn_master_crate
 
static BOOL enable_rpc_slave
 
static BOOL event_ended = FALSE
 
static INT last_cycle = 0
 
static INT last_event_number = 0
 
static INT sent_stop_request = -1
 
struct readout_module rpc_slave_module
 

Function Documentation

INT rpc_end_of_cycle ( INT  index,
void *  prpc_param[] 
)

Definition at line 49 of file rpc_slave.cpp.

References diag_print(), equipment, event_ended, event_number, last_cycle, last_event_number, and SUCCESS.

Referenced by rpc_slave_init().

50 {
51  INT cycle_number = CINT(0);
52  INT event_number = CINT(1);
53 
54  diag_print(2, "Cycle ended: RAM %d, event %d\n", cycle_number, event_number);
55 
56  // first send out "fake" zero-length events for those cycles
57  // where we didn't participate
58  for(INT fake_evnum=last_event_number+1; fake_evnum < event_number;
59  fake_evnum++)
60  {
61  diag_print(2, "Sending fake catch-up event for %d\n", fake_evnum);
62  char fake_event[sizeof(EVENT_HEADER) + sizeof(BANK_HEADER)];
63  char *pevent = fake_event + sizeof(EVENT_HEADER);
64 
65  rpc_flush_event();
66  bk_init32(pevent);
67  bm_compose_event((EVENT_HEADER *) fake_event, equipment[0].info.event_id, 0,
68  bk_size(pevent), fake_evnum);
69  bm_send_event(equipment[0].buffer_handle, fake_event,
70  sizeof(fake_event), SYNC);
71  bm_flush_cache(equipment[0].buffer_handle, SYNC);
72  }
73 
74  event_ended = true;
75  last_cycle = cycle_number;
77 
78  return SUCCESS;
79 }
INT rpc_slave_bor ( )

Definition at line 92 of file rpc_slave.cpp.

References crate_number, diag_print(), enable_rpc_slave, event_ended, FALSE, i, last_cycle, last_event_number, MAX_CRATES, odb_find_key(), odb_get_bool(), rpc_conn_master_crate, send_ready_for_cycle(), sent_stop_request, sprintf(), SUCCESS, and TRUE.

93 {
96  sent_stop_request = -1;
97  last_cycle = 0;
98 
99  // find the master crate
100  int master_crate = -1;
101  for(int i = 0; i < MAX_CRATES; i++) {
102  if(odb_find_key("/Equipment/Crate %d", i) != NULL) {
103  BOOL master = odb_get_bool("/Equipment/Crate %d/Settings/Master", i);
104  if(master) master_crate = i;
105  }
106  }
107 
108  // maybe we're the master...in that case, disable slave function
109  if(master_crate == crate_number) {
111  diag_print(1, "Disabling RPC slave function\n");
112  return SUCCESS;
113  } else {
115  diag_print(1, "Enabling RPC slave function\n");
116  }
117 
118  // return error if unable to find the master crate
119  if(master_crate < 0) {
120  diag_print(0, "Unable to locate master crate\n");
121  return FE_ERR_HW;
122  }
123  diag_print(1, "Found master crate %d\n", master_crate);
124 
125  // establish RPC connections to the master crate
126  char master_crate_label[10];
127  sprintf(master_crate_label, "Crate %d", master_crate);
128 
129  cm_connect_client(master_crate_label, &rpc_conn_master_crate);
130  rpc_set_option(rpc_conn_master_crate, RPC_OTRANSPORT, RPC_FTCP);
131  rpc_set_option(rpc_conn_master_crate, RPC_NODELAY, TRUE);
132 
134 
135  return SUCCESS;
136 }
INT rpc_slave_eor ( )

Definition at line 139 of file rpc_slave.cpp.

References enable_rpc_slave, rpc_conn_master_crate, and SUCCESS.

140 {
141  if(enable_rpc_slave) {
142  cm_disconnect_client(rpc_conn_master_crate, 0);
143  }
144  return SUCCESS;
145 }
INT rpc_slave_init ( )

Definition at line 82 of file rpc_slave.cpp.

References RPC_END_OF_CYCLE, rpc_end_of_cycle(), rpc_list_mucap, and SUCCESS.

83 {
84  // register the RPC function that we provide
85  rpc_register_functions(rpc_list_mucap, NULL);
86  rpc_register_function(RPC_END_OF_CYCLE, rpc_end_of_cycle);
87 
88  return SUCCESS;
89 }
INT rpc_slave_poll_dead ( )

Definition at line 168 of file rpc_slave.cpp.

References enable_rpc_slave, FE_NEED_START, and SUCCESS.

169 {
170  if(!enable_rpc_slave) {
171  return SUCCESS;
172  }
173 
174  return FE_NEED_START;
175 }
INT rpc_slave_poll_live ( )

Definition at line 148 of file rpc_slave.cpp.

References diag_print(), enable_rpc_slave, event_ended, FALSE, FE_END_BLOCK, and SUCCESS.

149 {
150  if(!enable_rpc_slave) {
151  return SUCCESS;
152  }
153 
154  // Yield to receive any pending RPCs
155  cm_yield(0);
156 
157  // Have we received an end-of-event notice?
158  if(event_ended) {
159  event_ended = FALSE;
160  diag_print(2, "event ended\n");
161  return FE_END_BLOCK;
162  } else {
163  return SUCCESS;
164  }
165 }
INT rpc_slave_read ( char *  pevent)

Definition at line 197 of file rpc_slave.cpp.

References enable_rpc_slave, last_event_number, send_ready_for_cycle(), and SUCCESS.

198 {
199  if(!enable_rpc_slave) {
200  return SUCCESS;
201  }
202 
203  // Fill in event number
204  (((EVENT_HEADER *)pevent)-1)->serial_number = last_event_number;
205 
206  // Announce that we're ready for the next cycle
207 
209 
210  return SUCCESS;
211 }
INT rpc_slave_stop_block ( )

Definition at line 178 of file rpc_slave.cpp.

References crate_number, enable_rpc_slave, event_number, last_event_number, rpc_conn_master_crate, RPC_REQUEST_STOP, sent_stop_request, and SUCCESS.

179 {
180  if(!enable_rpc_slave) {
181  return SUCCESS;
182  }
183 
185 
186  // Send a request to the master crate for the block to end.
187  if(sent_stop_request < event_number) {
189  event_number);
191  }
192 
193  return SUCCESS;
194 }
INT send_ready_for_cycle ( )

Definition at line 214 of file rpc_slave.cpp.

References crate_number, diag_print(), rpc_conn_master_crate, RPC_READY_FOR_CYCLE, and SUCCESS.

Referenced by rpc_slave_bor(), and rpc_slave_read().

215 {
216  // Send "ready to go"
217  struct timeval tv1, tv2;
218  gettimeofday(&tv1, NULL);
220  gettimeofday(&tv2, NULL);
221 
222  diag_print(2, "Waited %f microseconds for RPC_READY_FOR_CYCLE.\n",
223  (tv2.tv_sec-tv1.tv_sec)*1e6 + (tv2.tv_usec-tv1.tv_usec));
224 
225  return SUCCESS;
226 }

Variable Documentation

BOOL enable_rpc_slave
static

Definition at line 28 of file rpc_slave_x.cpp.

BOOL event_ended = FALSE
static

Definition at line 30 of file rpc_slave_x.cpp.

INT last_cycle = 0
static

Definition at line 31 of file rpc_slave_x.cpp.

INT last_event_number = 0
static

Definition at line 32 of file rpc_slave_x.cpp.

HNDLE rpc_conn_master_crate
static

Definition at line 27 of file rpc_slave_x.cpp.

struct readout_module rpc_slave_module
INT sent_stop_request = -1
static

Definition at line 33 of file rpc_slave_x.cpp.