/* * rpc_master_bor() */ INT rpc_master_bor() { if(!enable_rpc_master) { return SUCCESS; } for(int i = 0; i < MAX_CRATES; i++) { if(i != crate_number) { bool enabled = false; if(odb_find_key("/Equipment/Crate %d", i) != NULL) { enabled = odb_get_bool("/Equipment/Crate %d/Settings/Enabled", i); } crate[i].enabled = enabled; if(enabled) { crate[i].synchronous = odb_get_bool("/Equipment/Crate %d/Settings/Synchronous", i); char crate_label[10]; sprintf(crate_label, "Crate %d", i); cm_connect_client(crate_label, &crate[i].conn); rpc_set_option(crate[i].conn, RPC_OTRANSPORT, RPC_FTCP); rpc_set_option(crate[i].conn, RPC_NODELAY, TRUE); } } } event_number = 1; request_stop_event = 0; return SUCCESS; }
/* ********************************************************************* */ INT rpc_slave_bor() { event_ended = FALSE; last_event_number = 0; sent_stop_request = -1; last_cycle = 0; // find the master crate int master_crate = -1; for(int i = 0; i < MAX_CRATES; i++) { if(odb_find_key("/Equipment/Crate %d", i) != NULL) { BOOL master = odb_get_bool("/Equipment/Crate %d/Settings/Master", i); if(master) master_crate = i; } } // maybe we're the master...in that case, disable slave function if(master_crate == crate_number) { enable_rpc_slave = FALSE; diag_print(1, "Disabling RPC slave function\n"); return SUCCESS; } else { enable_rpc_slave = TRUE; diag_print(1, "Enabling RPC slave function\n"); } // return error if unable to find the master crate printf("looking for master crate ...\n"); if(master_crate < 0) { printf("no master found\n"); diag_print(0, "Unable to locate master crate\n"); return FE_ERR_HW; } diag_print(1, "Found master crate %d\n", master_crate); printf("Master :%d\n", master_crate); // establish RPC connections to the master crate char master_crate_label[10]; sprintf(master_crate_label, "Crate %d", master_crate); cm_connect_client(master_crate_label, &rpc_conn_master_crate); rpc_set_option(rpc_conn_master_crate, RPC_OTRANSPORT, RPC_FTCP); rpc_set_option(rpc_conn_master_crate, RPC_NODELAY, TRUE); send_ready_for_cycle(); return SUCCESS; }
int cam_init_rpc(char *host_name, char *exp_name, char *fe_name, char *client_name, char *rpc_server) { INT status, i, size; char str[256]; HNDLE hDB, hKey, hRootKey, hSubkey; if (rpc_server[0]) { /* connect directly to RPC server, not to MIDAS experiment */ midas_connect = FALSE; #ifdef OS_WINNT { WSADATA WSAData; /* Start windows sockets */ if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0) return RPC_NET_ERROR; } #endif rpc_set_name(client_name); rpc_register_functions(rpc_get_internal_list(0), NULL); rpc_register_functions(rpc_get_internal_list(1), NULL); status = rpc_client_connect(rpc_server, 1750, client_name, &hConn); if (status != RPC_SUCCESS) { printf("Cannot connect to RPC server running on %s at port 1750.\n", rpc_server); return status; } } else { /* connect to MIDAS experiment */ midas_connect = TRUE; /* turn off message display, turn on message logging */ cm_set_msg_print(MT_ALL, 0, NULL); /* connect to experiment */ status = cm_connect_experiment(host_name, exp_name, client_name, 0); if (status != CM_SUCCESS) return CM_UNDEF_EXP; /* connect to the database */ cm_get_experiment_database(&hDB, &hKey); /* find CNAF server if not specified */ strcpy(str, fe_name); if (fe_name[0] == '\0') { /* find client which exports CNAF function */ status = db_find_key(hDB, 0, "System/Clients", &hRootKey); if (status == DB_SUCCESS) { for (i = 0, status = 0;; i++) { status = db_enum_key(hDB, hRootKey, i, &hSubkey); if (status == DB_NO_MORE_SUBKEYS) { printf("No client currently exports the CNAF functionality.\n"); cm_disconnect_experiment(); return CM_UNDEF_EXP; } sprintf(str, "RPC/%d", RPC_CNAF16); status = db_find_key(hDB, hSubkey, str, &hKey); if (status == DB_SUCCESS) { size = sizeof(str); db_get_value(hDB, hSubkey, "Name", str, &size, TID_STRING, TRUE); break; } } } } /* register CNAF_RPC call */ if (cm_connect_client(str, &hConn) == CM_SUCCESS) { DWORD data, size, q, x; /* test if CNAF function implemented */ size = sizeof(WORD); status = rpc_client_call(hConn, RPC_CNAF16, CNAF_TEST, 0, 0, 0, 0, 0, &data, &size, &q, &x); if (status != RPC_SUCCESS) { printf("CNAF functionality not implemented by frontend %s\n", fe_name); cm_disconnect_client(hConn, FALSE); return CM_NO_CLIENT; } } else { printf("Cannot connect to frontend %s\n", fe_name); return CM_NO_CLIENT; } } return SUCCESS; }