Exemple #1
0
/*
 * 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;
}
Exemple #2
0
/* ********************************************************************* */
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;
}
Exemple #3
0
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;
}