Esempio n. 1
0
/* close communication with mainframe under logical number 'id'
   and stop thread */
int
sy527Stop(unsigned id)
{
  char name[MAX_NAME];
  int i, j, ret;

  /* lock global mutex to prevent other mainframes to be stoped
     until we are done with this one */
  LOCK_GLOBAL;

  CHECK_ID(id);
  CHECK_OPEN(id);
  strcpy(name, Measure[id]->name);


  /* stop thread */
  force_exit[id] = 1;


  ret = CAENHVDeinitSystem(name);

  if(ret == CAENHV_OK)
  {
    printf("\nConnection >%s< closed (num. %d)\n\n", name,ret);
    Measure[id]->id = -1;
  }
  else
  {
    printf("\nERROR(sy527): %s (num. %d)\n\n", CAENHVGetError(name), ret);
    UNLOCK_GLOBAL;

    return(CAENHV_SYSERR);
  }

  /* unregister mainframe */
  j = -1;
  for(i=0; i<nmainframes; i++)
  {
    if(mainframes[i] == id)
    {
      j = i;
      break;
    }
  }
  if(j==-1)
  {
    printf("ERROR: mainframe %d was not registered\n",id);
    UNLOCK_GLOBAL;

    return(CAENHV_SYSERR);
  }
  for(i=j; i<nmainframes; i++) mainframes[i] = mainframes[i+1];
  nmainframes --;

  UNLOCK_GLOBAL;

  return(CAENHV_OK);
}
int
sy1527GetMap(unsigned int id)
{ 
  unsigned short NrOfSl, *SerNumList, *NrOfCh, ChList[MAX_CHAN];
  char *ModelList, *DescriptionList;
  unsigned char	*FmwRelMinList, *FmwRelMaxList;
  char name[MAX_CAEN_NAME];
  int i, j, ret;
  unsigned long tipo;
  char ParName[MAX_CAEN_NAME];

  CHECK_ID(id);
  CHECK_OPEN(id);
  strcpy(name, Measure[id].name);

  /*
  char *ParNameList, *plist;
  CAENHVGetChParamInfo(name,0,1,&ParNameList);
  plist=ParNameList;
  for(i=0;i<10;i++){
    if(*plist == '\0'){printf("NULL %d\n",i);break;}
    //if(ParNameList[i])
    printf("param=%s %d\n",plist, i);
    plist+=strlen(plist)+1;
    //else printf("param number %d is NULL\n", i);
  }
  */

  /*  
  char **ParNameList;
  CAENHVGetChParamInfo(name,1,0,ParNameList);
  //  plist=ParNameList;
  for(i=0;i<10;i++){
    // if(*plist == '\0'){printf("NULL %d\n",i);break;}
    if(ParNameList[i])
    printf("param=%s %d\n",ParNameList[i], i);
    //    plist+=strlen(plist)+1;
    //else printf("param number %d is NULL\n", i);
  }
  */

  /*
  char *ParNameList, (*parnamelist)[100];
  CAENHVGetChParamInfo(name,0,0,&ParNameList);
  parnamelist=( char (*)[100])ParNameList;
  int nj=0;
  for(nj=0;parnamelist[nj][0];nj++);
  printf("nj=%d\n",nj);
  //  plist=ParNameList;
  // for(i=0;i<10;i++){
    // if(*plist == '\0'){printf("NULL %d\n",i);break;}
  //  if(ParNameList[i])
  //  printf("param=%s %d\n",ParNameList[i], i);
    //    plist+=strlen(plist)+1;
    //else printf("param number %d is NULL\n", i);
    // }
    */


  ret = CAENHVGetCrateMap(name, &NrOfSl, &NrOfCh, &ModelList,
                          &DescriptionList, &SerNumList,
                          &FmwRelMinList, &FmwRelMaxList );
  if(ret != CAENHV_OK)
  {
    printf("ERROR(sy1527): %s (num. %d)\n\n", CAENHVGetError(name), ret);
  }
  else
  {
    char *m = ModelList, *d = DescriptionList;

    printf("Measure MAP:\n\n");// my:
    printf("NrofSl=%d\n",NrOfSl); // my:
    Measure[id].nslots = NrOfSl;
    printf("=========================> %d %d\n",id,Measure[id].nslots); //my:
    Demand[id].nslots = NrOfSl;
    for(i=0; i<NrOfSl; i++, m+=strlen(m)+1, d+=strlen(d)+1)
    {
      if(*m == '\0')
      {
        Measure[id].board[i].nchannels = 0;
        Demand[id].board[i].nchannels = 0;
        /*printf("Board %2d: Not Present\n", i);*/
      }
      else
      {

///----------------- HV parameters finding piece ------------------- 

 // printf("name================================================%s\n",name);
  int retv;
  retv=CAENHVGetChParamInfo(name,i,0,&g_parr);

  int nj=0;
  int ni=0;
  int index=0;
 while(1){

 if(!((nj)%10)){
  if((*(g_parr+nj))==0){
   g_parr_index[index++]=ni;
  // printf("%s\n",g_parr+ni);
   break;
  }
  else{
   if(nj!=0){
    // printf("%s\n",g_parr+ni);
     g_parr_index[index++]=ni;
     ni=nj;
   }
  }
 }
 nj++;
 //printf("%c %d\n",*(parr+nj), *(parr+nj));
 }

 int found=0;
 char tmp[PATH_MAX];

 strcpy(tmp,getenv("HOME"));
 strcat(tmp,"/.hv_params");
 if(!fp_params){
  fp_params = fopen(tmp,"w+");
  if(fp_params)
  fprintf(fp_params, "This file contains not found parameters: \n");
  fflush(fp_params);
 }

 // printf("nj================================================%d i=%d retv=%d %d\n",nj, i, retv,sizeof(A1520param));

 for(ni=0; ni < nA1520param; ni++){
  found=0;
  for(nj=0;nj<index;nj++){
   if(!strcmp(A1520param[ni],g_parr+g_parr_index[nj]))found=1;
  }
  if(!found){
   if(fp_params)
   fprintf(fp_params, "parameter %s: NOT FOUND. CRATE=%s SLOT=%d \n",A1520param[ni], name, i);
   exit(1);
  }
 }
  // if(fp_params)
  // fprintf(fp_params, "all parameters are found in crate:%s the slot: %d\n",name, i);

///----------------- end of HV parameters finding piece ------------------- 

        strncpy(Measure[id].board[i].modelname,m,MAX_CAEN_NAME-1);
        strncpy(Measure[id].board[i].description,d,MAX_CAEN_NAME-1);
        Measure[id].board[i].nchannels = NrOfCh[i];
        Measure[id].board[i].sernum = SerNumList[i];
        Measure[id].board[i].relmax = FmwRelMaxList[i];
        Measure[id].board[i].relmin = FmwRelMinList[i];
        strncpy(Demand[id].board[i].modelname,m,MAX_CAEN_NAME-1);
        strncpy(Demand[id].board[i].description,d,MAX_CAEN_NAME-1);
        Demand[id].board[i].nchannels = NrOfCh[i];
        Demand[id].board[i].sernum = SerNumList[i];
        Demand[id].board[i].relmax = FmwRelMaxList[i];
        Demand[id].board[i].relmin = FmwRelMinList[i];
        printf("Board %2d: %s %s  Nr. Ch: %d  Ser. %d   Rel. %d.%d\n",
                i, m, d, NrOfCh[i], SerNumList[i], FmwRelMaxList[i], 
                FmwRelMinList[i]);

        /* get params info */
        for(j=0; j<Demand[id].board[i].nchannels; j++)
          ChList[j] = (unsigned short)j;




        if(!strcmp(Measure[id].board[i].modelname,"A1535") || !strcmp(Measure[id].board[i].modelname,"A1733") ) // my: was A1520
        {
          printf("---> found board %s\n",Measure[id].board[i].modelname);
          Measure[id].board[i].nparams = nA1535param;
          Demand[id].board[i].nparams = nA1535param;
          for(j=0; j<Measure[id].board[i].nparams; j++)
          {
            strcpy(Measure[id].board[i].parnames[j],A1535param[j]);
            strcpy(Demand[id].board[i].parnames[j],A1535param[j]);

            strcpy(ParName,Measure[id].board[i].parnames[j]);
            ret=CAENHVGetChParamProp(name,i,ChList[0],ParName,"Type",&tipo);
            if(ret != CAENHV_OK)
            {
              printf("CAENHVGetChParamProp error: %s (num. %d) ParName=>%s<\n",
                     CAENHVGetError(name),ret,ParName);
              Measure[id].board[i].nchannels = 0;
              Demand[id].board[i].nchannels = 0;
	          return(CAENHV_SYSERR);
            }
            else
            {
              Measure[id].board[i].partypes[j] = tipo;
              Demand[id].board[i].partypes[j] = tipo;
            }
          }
        }
        else if( !strcmp(Measure[id].board[i].modelname,"A1520")) // my: was A1520
        {
          printf("---> found board %s\n",Measure[id].board[i].modelname);
          Measure[id].board[i].nparams = nA1520param;
          Demand[id].board[i].nparams = nA1520param;
          for(j=0; j<Measure[id].board[i].nparams; j++)
          {
            strcpy(Measure[id].board[i].parnames[j],A1520param[j]);
            strcpy(Demand[id].board[i].parnames[j],A1520param[j]);

            strcpy(ParName,Measure[id].board[i].parnames[j]);
            ret=CAENHVGetChParamProp(name,i,ChList[0],ParName,"Type",&tipo);
            if(ret != CAENHV_OK)
            {
              printf("CAENHVGetChParamProp error: %s (num. %d) ParName=>%s<\n",
                     CAENHVGetError(name),ret,ParName);
              Measure[id].board[i].nchannels = 0;
              Demand[id].board[i].nchannels = 0;
	          return(CAENHV_SYSERR);
            }
            else
            {
              Measure[id].board[i].partypes[j] = tipo;
              Demand[id].board[i].partypes[j] = tipo;
            }
          }
        }
        else
        {
          printf("Unknown board =%s\n",Measure[id].board[i].modelname);
          Measure[id].board[i].nchannels = 0;
          Demand[id].board[i].nchannels = 0;
        }
      }
    }
    /*printf("\n");*/
    free(SerNumList);
    free(ModelList);
    free(DescriptionList);
    free(FmwRelMinList);
    free(FmwRelMaxList);
    free(NrOfCh);


    // free(ParNameList); // my:

  }

  return(CAENHV_OK);
}
int
sy1527SetBoard(unsigned int id, unsigned int board)
{
  int nXXXXXparam;
  char *XXXXparam[MAX_PARAM];

  char name[MAX_CAEN_NAME];
  int i, ipar, iparr, ret;
  unsigned short Slot, ChNum, ChList[MAX_CHAN], Ch;
  float fParVal;///, fparval[MAX_CHAN];
  unsigned long	tipo, lParVal;///, lparval[MAX_CHAN];
  char ParName[MAX_CAEN_NAME];

  CHECK_ID(id);
  CHECK_OPEN(id);
  strcpy(name, Demand[id].name);

  nXXXXXparam = Demand[id].board[board].nparams;
  for(i=0;i<nXXXXXparam;i++) XXXXparam[i]=Demand[id].board[board].parnames[i];

  Slot = board;
  ChNum = Demand[id].board[board].nchannels;
  for(i = 0; i<ChNum; i++) ChList[i] = (unsigned short)i;

  /* loop over parameters */
  for(iparr=0; iparr<nXXXXXparam; iparr++)
  {
	/* patch to make sure 'PwEn' always executed before 'Pw' */
    if(iparr == Pw)        ipar = PwEn;
    else if(iparr == PwEn) ipar = Pw;
    else                   ipar = iparr;

    strcpy(ParName,XXXXparam[ipar]); /* Param name */
    tipo = Demand[id].board[board].partypes[ipar];



    /* will be good to do it this way, but is does not work
    if(tipo == PARAM_TYPE_NUMERIC)
    {
      for(Ch=0; Ch<ChNum; Ch++)
      {
        fparval[Ch] = Demand[id].board[board].channel[Ch].fval[ipar];
	fparval[Ch] = 1.0*Ch+1.0;
        printf("Value %s: %f\n",ParName,fparval[Ch]);
      }
      ret = CAENHVSetChParam(name, Slot, ParName, ChNum, ChList, fparval);
    }
    else
    {
      for(Ch=0; Ch<ChNum; Ch++)
      {
        lparval[Ch] = Demand[id].board[board].channel[Ch].lval[ipar];
        printf("Value %s: %ld\n",ParName,lparval[Ch]);
      }
      ret = CAENHVSetChParam(name, Slot, ParName, ChNum, ChList, lparval);
    }

    if(ret != CAENHV_OK)
    {
      printf("CAENHVSetChParam: %s (num. %d)\n",CAENHVGetError(name),ret);
      return(CAENHV_SYSERR);
    }
    */

    /* loop over all channels */
    for(Ch=0; Ch<ChNum; Ch++)
    {
      if(Demand[id].board[board].channel[Ch].setflag[ipar] == 1)
      {
        if(tipo == PARAM_TYPE_NUMERIC)
        {
          fParVal = Demand[id].board[board].channel[Ch].fval[ipar];
          /*printf("Set Value %s: %f\n",ParName,fParVal);*/
          ret = CAENHVSetChParam(name, Slot, ParName, 1, &Ch, &fParVal);
        }
        else
        {
          lParVal = Demand[id].board[board].channel[Ch].lval[ipar];
/// printf("Set Value %s: %ld\n",ParName,lParVal);
          ret = CAENHVSetChParam(name, Slot, ParName, 1, &Ch, &lParVal);
        }

        if(ret != CAENHV_OK)
        {
          /* set was unsuccessful so return error */
          printf("CAENHVSetChParam error: %s (num. %d)\n",CAENHVGetError(name),ret);
          return(CAENHV_SYSERR);
        }
        else
        {
          /* set was successful so cleanup setflag */
          Demand[id].board[board].channel[Ch].setflag[ipar] = 0;
        }
      }
    }
  }

  return(CAENHV_OK);
}
int
sy1527GetBoard(unsigned int id, unsigned int board)
{

  int b_status=0;/// b_status_res=0; /// my: smi

  int nXXXXXparam;
  char *XXXXparam[MAX_PARAM];

  char name[MAX_CAEN_NAME];
  int i, ipar, ret, i10;
  unsigned short Slot, ChNum, ChList[MAX_CHAN], Ch;
  float fParValList[MAX_CHAN];
  unsigned long	tipo, lParValList[MAX_CHAN];
  char ParName[MAX_CAEN_NAME];

  CHECK_ID(id);
  CHECK_OPEN(id);
  strcpy(name, Measure[id].name);

  for(i10=0;i10<nmainframes;i10++){ // my_n: hbeat
   if(mainframes[i10]==id)break;
  }


  nXXXXXparam = Measure[id].board[board].nparams;
  for(i=0;i<nXXXXXparam;i++) XXXXparam[i]=Measure[id].board[board].parnames[i];

  Slot = board;
  ChNum = Measure[id].board[board].nchannels;

  for(i = 0; i<ChNum; i++)
  {
    Ch = i;
    ChList[i] = (unsigned short)Ch;
  }

  /* loop over parameters */
  for(ipar=0; ipar<nXXXXXparam; ipar++)
  {
    strcpy(ParName,XXXXparam[ipar]); /* Param name */
    tipo = Measure[id].board[board].partypes[ipar];

   // if(!strcmp(ParName,"RUp"))printf("RUp type=%d %d\n",tipo,PARAM_TYPE_NUMERIC);
    if(tipo == PARAM_TYPE_NUMERIC)
    {
      ret = CAENHVGetChParam(name, Slot, ParName, ChNum, ChList, fParValList);
//if(!strcmp(ParName,"RUp")){ printf("%s %d %d \n",name, Slot, ChNum);
//printf("RUp f %f\n",fParValList[0]);}
    }
    else
    {
      ret = CAENHVGetChParam(name, Slot, ParName, ChNum, ChList, lParValList);
//if(!strcmp(ParName,"RUp"))printf("RUp l %d\n", lParValList);
    }
///-------------- simulator -------
/**
FILE *fps=fopen("/home/clasioc/flags","r");
int flags; 
//printf("pointer=%p\n",fps);
fscanf(fps,"%d",&flags);//printf("%d\n",flags);
//printf("%s\n",name);
if(!strcmp(name,"B_HV009"))
{
 ///printf("%d\n",flags);
 if(flags==1) { printf("==%d\n",flags); ret=4001;}
}
fclose(fps);
*/
///--------------------------------
    if(ret != CAENHV_OK)
    {
     printf("CAENHVGetChParam error: %s (num. %d) id=%d \n\n", CAENHVGetError(name), ret, id);
      mainframes_disconnect[i10]=1; /// my_n: hbeat
    ///  mainframes[i10]=-1;
    }
    else
    {
   ///   mainframes_disconnect[i10]=0; /// my_n: hbeat
      /*printf("PARAM VALUE\n");*/
      if(tipo == PARAM_TYPE_NUMERIC)
      {
        for(i=0; i<ChNum; i++)
        {
          Measure[id].board[board].channel[i].fval[ipar] = fParValList[i];
          /*printf("Slot: %2d  Ch: %3d  %s: %10.2f\n", Slot, ChList[i],
            ParName, fParValList[i]);*/
        }
      }
      else
      {
        for(i=0; i<ChNum; i++)   
        {
          Measure[id].board[board].channel[i].lval[ipar] = lParValList[i];
          if(ipar==Status){
          /// my: smi: accumulates all channels attuses into board status
           b_status = b_status | lParValList[i];
           if(!(lParValList[i] & 0x1))b_status = b_status | BIT_OFF; /// at least one channel in the board is OFF
          }
          /*printf("Slot: %2d  Ch: %3d  %s: %x\n", Slot, ChList[i],
            ParName, lParValList[i]);*/ 
        }
      }
    }
  }
  /// my:smi
/*
  char smi_obj_name1[150]; /// temporal
  char smi_obj_name[150]; /// temporal
  char smi_command[150];  /// temporal
  if(b_status & BIT_ON)b_status_res=BIT_ON;
  if(b_status & (BIT_RAMPUP | BIT_RAMPDOWN ))b_status_res=BIT_RAMPUP;
  if(b_status & BIT_OFF)b_status_res=BIT_OFF;
  if(b_status & (BIT_INTTRIP | BIT_EXTTRIP | BIT_OVERCUR | BIT_OVERVOLT | BIT_UNDERVOLT )) b_status_res=BIT_INTTRIP;

  if(b_status_res==BIT_ON)strcpy(smi_command,"SET_ON");
  else if(b_status_res==BIT_RAMPUP)strcpy(smi_command,"SET_ON");  /// temporal !!!
  else if(b_status_res==BIT_OFF)strcpy(smi_command,"SET_OFF");
  else if(b_status_res==BIT_INTTRIP)strcpy(smi_command,"SET_ERROR");

  if(b_status_res != boards_status[id][board]){

   sprintf(smi_obj_name1, CRATE_LABEL, id);
   sprintf(smi_obj_name, "HV_TEST::%s_%d", smi_obj_name1, board);
   smiui_send_command(smi_obj_name,  smi_command);
   printf("smi:  smi_obj_name=%s  smi_command=%s \n", smi_obj_name, smi_command);
   boards_status[id][board]=b_status_res;
  }
*/
  return(CAENHV_OK);
}
Esempio n. 5
0
/* open communication with mainframe under logical number 'id',
   do all necessary initialization and start thread */
int
sy1527Start(unsigned id_nowused, char *ip_address)
{
    int id; ///my:
    char arg[30], userName[20], passwd[30], name[MAX_CAEN_NAME];
    int link, ret;

    pthread_mutex_lock(&global_mutex);

    /* do global initialization on first call */
    if(nmainframes == -1) sy1527Init();

    nmainframes++;///my:
    ///id=nmainframes-1;///my:

    ///if((id+1)>nmainframes)nmainframes=id+1;
    id=id_nowused;///nmainframes-1;///my:

    printf("++++++++++++++++++++++++++++++++++++++++++++++++ nmainframes=%d id=%d\n", nmainframes, id);

    /* lock global mutex to prevent other mainframes to be started
       until we are done with this one */
    /// my: move upward - pthread_mutex_lock(&global_mutex); otherwise many sy1527Init() are possible

    if(nmainframes >= MAX_HVPS)
    {
        printf("ERROR: no more empty slots\n");
        pthread_mutex_unlock(&global_mutex);
        return(CAENHV_SYSERR);
    }

    CHECK_ID(id);
    CHECK_FREE(id);

/// my:  sprintf(name,"sy1527_%03d",id);
    sprintf(name, CRATE_LABEL, id); /// my:
    printf("System Name set as >%s<\n",name);

    strcpy(arg,ip_address);
    printf("TCP/IP address set as >%s<\n",arg);
    link = LINKTYPE_TCPIP;

    /*
    strcpy(userName, "user");
    strcpy(passwd, "user");
    */
    strcpy(userName, "admin");
    strcpy(passwd, "admin");

    ret = CAENHVInitSystem(name, link, arg, userName, passwd);

    printf("my: id_index=%d id=%d name=%s", id, ret, name );
    printf("\nCAENHVInitSystem error: %s (num. %d)\n\n", CAENHVGetError(name),ret);

    if(ret == CAENHV_OK)
    {
        if(strlen(ip_address)>=MAX_CAEN_NAME) {
            printf("too long mainfraime IP: exits now\n");    /// my:
            exit(1);
        }
        strcpy(Measure[id].IPADDR,ip_address); /// my:
        Measure[id].id = ret;
        strcpy(Measure[id].name, name);
        Demand[id].id = ret;
        strcpy(Demand[id].name, name);
    }
    else
    {
        printf("\n CAENHVInitSystem returned %d\n\n",ret);
        pthread_mutex_unlock(&global_mutex);
        return(CAENHV_SYSERR);
    }

    /* init mainframe mutex */
    pthread_mutex_init(&mainframe_mutex[id], &mattr);

    /* start thread */
    stat[id].threadid = id;
    force_exit[id] = 0;
    if(pthread_create(&idth[id],NULL,sy1527MainframeThread,(void *)&stat[id])!=0)
    {
        printf("ERROR: pthread_create(0x%08lx[%d],...) failure\n",idth[id],id);
        pthread_mutex_unlock(&global_mutex);
        return(CAENHV_SYSERR);
    }
    else
    {
        printf("INFO: pthread_create(0x%08lx[%d],...) done\n",idth[id],id);
    }

    /* register mainframe */
    mainframes[nmainframes-1] = id; /// my: removed nmainframes++
    ///mainframes[id] = id;

    printf("====================== 111111111111\n");
    /* get mainframe map */
    sy1527GetMap(id);
    printf("====================== 222222222222\n");

    pthread_mutex_unlock(&global_mutex);

    return(CAENHV_OK);
}
Esempio n. 6
0
/* open communication with mainframe under logical number 'id',
   do all necessary initialization and start thread */
int
sy527Start(unsigned id, char *ip_address)
{
  char arg[30], userName[20], passwd[30], name[MAX_NAME];
  int link, ret;

  printf("123\n");fflush(stdout);

  /* do global initialization on first call */
  if(nmainframes == -1) sy527Init();

  printf("456\n");fflush(stdout);

  /* lock global mutex to prevent other mainframes to be started
     until we are done with this one */
  LOCK_GLOBAL;

  if(nmainframes >= MAX_HVPS)
  {
    printf("ERROR: no more empty slots\n");
    UNLOCK_GLOBAL;

    return(CAENHV_SYSERR);
  }

  CHECK_ID(id);
  CHECK_FREE(id);

  sprintf(name,"sy527_%03d",id);
  printf("System Name set as >%s<\n",name);

  /*strcpy(arg,ip_address); for sy1527*/
  /*printf("TCP/IP address set as >%s<\n",arg);*/

  strcpy(arg,"sy527_0x100000_9");

  /*link = LINKTYPE_TCPIP; for sy1527*/
  link = LINKTYPE_CAENET;

  strcpy(userName, "user");
  strcpy(passwd, "user");

  ret = CAENHVInitSystem(name, link, arg, userName, passwd);

  printf("\nCAENHVInitSystem: %s (num. %d)\n\n", CAENHVGetError(name),ret);

  if(ret == CAENHV_OK)
  {
    Measure[id]->id = ret;
    strcpy(Measure[id]->name, name); 
    Demand[id]->id = ret;
    strcpy(Demand[id]->name, name); 
  }
  else
  {
    printf("\n CAENHVInitSystem returned %d\n\n",ret);    
    UNLOCK_GLOBAL;

    return(CAENHV_SYSERR);
  }


#ifndef vxWorks
  /* init mainframe mutex */
  pthread_mutex_init(&mainframe_mutex[id], &mattr);
#else
  mainframe_mutex[id] = semBCreate(SEM_Q_FIFO, SEM_FULL);
  if(mainframe_mutex[id] == NULL)
  {
    printf("ERROR: could not allocate 'mainframe_mutex' semaphore\n");
    return(0);
  }
#endif


  /* start thread */
  stat[id].threadid = id;
  force_exit[id] = 0;

#ifdef vxWorks
  {
    int iTaskStat;
    iTaskStat = taskSpawn("SY527THRD", 150, 0, 800000, sy527Thread,
                          &stat[id], 0, 0,0,0,0,0,0,0,0);
    printf("taskSpawn(\"SY527THRD\") returns %d\n",iTaskStat);
    if(iTaskStat == ERROR)
    {
	  perror("taskSpawn"); 
      UNLOCK_GLOBAL;
    }
  }
#else
  if(pthread_create(&idth[id],NULL,sy527Thread,(void *)&stat[id])!=0)
  {
    printf("ERROR: pthread_create(0x%08lx[%d],...) failure\n",idth[id],id);
    UNLOCK_GLOBAL;
    return(CAENHV_SYSERR);
  }
  else
  {
    printf("INFO: pthread_create(0x%08lx[%d],...) done\n",idth[id],id);
  }
#endif

  /* register mainframe */
  mainframes[nmainframes++] = id;

  /* get mainframe map */
  sy527GetMap(id);

  UNLOCK_GLOBAL;

  return(CAENHV_OK);
}
Esempio n. 7
0
int
sy527GetMap(unsigned int id)
{ 
  unsigned short NrOfSl, *SerNumList, *NrOfCh, ChList[MAX_CHAN];
  char *ModelList, *DescriptionList;
  unsigned char	*FmwRelMinList, *FmwRelMaxList;
  char name[MAX_NAME];
  int i, j, ret;
  unsigned long tipo;
  char ParName[MAX_NAME];

  CHECK_ID(id);
  CHECK_OPEN(id);
  strcpy(name, Measure[id]->name);

  ret = CAENHVGetCrateMap(name, &NrOfSl, &NrOfCh, &ModelList,
                          &DescriptionList, &SerNumList,
                          &FmwRelMinList, &FmwRelMaxList );
  if(ret != CAENHV_OK)
  {
    printf("ERROR(sy527): %s (num. %d)\n\n", CAENHVGetError(name), ret);
  }
  else
  {
    char *m = ModelList, *d = DescriptionList;

    /*printf("Measure MAP:\n\n");*/
    Measure[id]->nslots = NrOfSl;
    printf("=========================> %d %d\n",id,Measure[id]->nslots);
    Demand[id]->nslots = NrOfSl;
    for(i=0; i<NrOfSl; i++, m+=strlen(m)+1, d+=strlen(d)+1)
    {
      if(*m == '\0')
      {
        Measure[id]->board[i].nchannels = 0;
        Demand[id]->board[i].nchannels = 0;
        printf("Board %2d: Not Present\n", i);
      }
      else
      {
        strncpy(Measure[id]->board[i].modelname,m,MAX_NAME-1);
        strncpy(Measure[id]->board[i].description,d,MAX_NAME-1);
        Measure[id]->board[i].nchannels = NrOfCh[i];
        Measure[id]->board[i].sernum = SerNumList[i];
        Measure[id]->board[i].relmax = FmwRelMaxList[i];
        Measure[id]->board[i].relmin = FmwRelMinList[i];
        strncpy(Demand[id]->board[i].modelname,m,MAX_NAME-1);
        strncpy(Demand[id]->board[i].description,d,MAX_NAME-1);
        Demand[id]->board[i].nchannels = NrOfCh[i];
        Demand[id]->board[i].sernum = SerNumList[i];
        Demand[id]->board[i].relmax = FmwRelMaxList[i];
        Demand[id]->board[i].relmin = FmwRelMinList[i];
        printf("Board %2d: %s %s  Nr. Ch: %d  Ser. %d   Rel. %d.%d\n",
                i, m, d, NrOfCh[i], SerNumList[i], FmwRelMaxList[i], 
                FmwRelMinList[i]);
		
		

        /* get params info */
        for(j=0; j<Demand[id]->board[i].nchannels; j++)
          ChList[j] = (unsigned short)j;
        printf("The board is: >%s<\n",Measure[id]->board[i].modelname);
        if( !strcmp(Measure[id]->board[i].modelname,"A1520") )
        {
    	  printf("The board %s is connecting\n",Measure[id]->board[i].modelname);
          Measure[id]->board[i].nparams = nA1520param;
          Demand[id]->board[i].nparams = nA1520param;
          for(j=0; j<Measure[id]->board[i].nparams; j++)
          {
            strcpy(Measure[id]->board[i].parnames[j],A1520param[j]);
            strcpy( Demand[id]->board[i].parnames[j],A1520param[j]);

            strcpy(ParName,Measure[id]->board[i].parnames[j]);
            ret=CAENHVGetChParamProp(name,i,ChList[0],ParName,"Type",&tipo);
            if(ret != CAENHV_OK)
            {
              printf("CAENHVGetChParamProp: %s (num. %d) ParName=>%s<\n",
                     CAENHVGetError(name),ret,ParName);
              Measure[id]->board[i].nchannels = 0;
              Demand[id]->board[i].nchannels = 0;
              return(CAENHV_SYSERR);
            }
            else
            {
              Measure[id]->board[i].partypes[j] = tipo;
              Demand[id]->board[i].partypes[j] = tipo;
            }
          }
        }
        else if( !strcmp(Measure[id]->board[i].modelname,"A1533") ||
		         !strcmp(Measure[id]->board[i].modelname,"A1733") )
        {
    	  printf("The board %s is connecting\n",Measure[id]->board[i].modelname);
          Measure[id]->board[i].nparams = nA1533_1733param;
          Demand[id]->board[i].nparams = nA1533_1733param;
          for(j=0; j<Measure[id]->board[i].nparams; j++)
          {
            strcpy(Measure[id]->board[i].parnames[j],A1533_1733param[j]);
            strcpy( Demand[id]->board[i].parnames[j],A1533_1733param[j]);

            strcpy(ParName,Measure[id]->board[i].parnames[j]);
            ret=CAENHVGetChParamProp(name,i,ChList[0],ParName,"Type",&tipo);
            if(ret != CAENHV_OK)
            {
              printf("CAENHVGetChParamProp: %s (num. %d) ParName=>%s<\n",
                     CAENHVGetError(name),ret,ParName);
              Measure[id]->board[i].nchannels = 0;
              Demand[id]->board[i].nchannels = 0;
              return(CAENHV_SYSERR);
            }
            else
            {
              Measure[id]->board[i].partypes[j] = tipo;
              Demand[id]->board[i].partypes[j] = tipo;
            }
          }
        }
        else if( !strcmp(Measure[id]->board[i].modelname,"A944N") )
        {
    	  printf("The board %s is connecting\n",Measure[id]->board[i].modelname);
          Measure[id]->board[i].nparams = nA944Nparam;
          Demand[id]->board[i].nparams = nA944Nparam;
          for(j=0; j<Measure[id]->board[i].nparams; j++)
          {
            strcpy(Measure[id]->board[i].parnames[j],A944Nparam[j]);
            strcpy( Demand[id]->board[i].parnames[j],A944Nparam[j]);

            strcpy(ParName,Measure[id]->board[i].parnames[j]);
            ret=CAENHVGetChParamProp(name,i,ChList[0],ParName,"Type",&tipo);
            if(ret != CAENHV_OK)
            {
              printf("CAENHVGetChParamProp: %s (num. %d) ParName=>%s<\n",
                     CAENHVGetError(name),ret,ParName);
              Measure[id]->board[i].nchannels = 0;
              Demand[id]->board[i].nchannels = 0;
              return(CAENHV_SYSERR);
            }
            else
            {
              Measure[id]->board[i].partypes[j] = tipo;
              Demand[id]->board[i].partypes[j] = tipo;
            }
          }
        }
        else
        {
          printf("Unknown board >%s<\n",Measure[id]->board[i].modelname);
          Measure[id]->board[i].nchannels = 0;
          Demand[id]->board[i].nchannels = 0;
        }
      }
    }
    /*printf("\n");*/
    free(SerNumList);
    free(ModelList);
    free(DescriptionList);
    free(FmwRelMinList);
    free(FmwRelMaxList);
    free(NrOfCh);
  }

  return(CAENHV_OK);
}
Esempio n. 8
0
int
sy527GetBoard(unsigned int id, unsigned int board)
{
  int nXXXXXparam;
  char *XXXXparam[MAX_PARAM];

  char name[MAX_NAME];
  int i, ipar, ret;
  unsigned short Slot, ChNum, ChList[MAX_CHAN], Ch;
  float fParValList[MAX_CHAN];
  unsigned long	tipo, lParValList[MAX_CHAN];
  char ParName[MAX_NAME];

  CHECK_ID(id);
  CHECK_OPEN(id);
  strcpy(name, Measure[id]->name);

  nXXXXXparam = Measure[id]->board[board].nparams;
  for(i=0;i<nXXXXXparam;i++) XXXXparam[i]=Measure[id]->board[board].parnames[i];

  Slot = board;
  ChNum = Measure[id]->board[board].nchannels;

  for(i = 0; i<ChNum; i++)
  {
    Ch = i;
    ChList[i] = (unsigned short)Ch;
  }

  /* loop over parameters */
  for(ipar=0; ipar<nXXXXXparam; ipar++)
  {
    strcpy(ParName,XXXXparam[ipar]); /* Param name */
    tipo = Measure[id]->board[board].partypes[ipar];
#ifdef DEBUG
    printf("%s called ipar=%d\n",__FUNCTION__,ipar);
#endif
    if(tipo == PARAM_TYPE_NUMERIC)
    {
      ret = CAENHVGetChParam(name, Slot, ParName, ChNum, ChList, fParValList);
    }
    else
    {
      ret = CAENHVGetChParam(name, Slot, ParName, ChNum, ChList, lParValList);
    }

    if(ret != CAENHV_OK)
    {
      printf("CAENHVGetChParam: %s (num. %d)\n\n", CAENHVGetError(name), ret);
    }
    else
    {
      /*printf("PARAM VALUE\n");*/
      if(tipo == PARAM_TYPE_NUMERIC)
      {
        for(i=0; i<ChNum; i++)
        {
          Measure[id]->board[board].channel[i].fval[ipar] = fParValList[i];
#ifdef DEBUG
          printf("%s Slot: %2d  Ch: %3d  %s: %10.2f\n", __FUNCTION__, Slot, ChList[i],
            ParName, fParValList[i]);
#endif
        }
      }
      else
      {
        for(i=0; i<ChNum; i++)   
        {
          Measure[id]->board[board].channel[i].lval[ipar] = lParValList[i];
#ifdef DEBUG
          printf("%s Slot: %2d  Ch: %3d  %s: %lx\n", __FUNCTION__, Slot, ChList[i],
            ParName, lParValList[i]);
#endif
        }
      }
    }
  }

  return(CAENHV_OK);
}