Changeset 35 for hvcontrol/src


Ignore:
Timestamp:
04/24/09 14:06:49 (16 years ago)
Author:
lstark
Message:
Calibration table (DAC - HV values) integrated
Location:
hvcontrol/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • hvcontrol/src/CCCommand.cc

    r14 r35  
    7979      m->status->Pc = comline;     
    8080                 
    81       sprintf(str,"Test in CCComand: %s",m->status->Pc);
    82       printf(str);
    8381
    8482      ParseInput(m->status->Pc,&(m->status->NParam),m->status->Param);
  • hvcontrol/src/HV.cc

    r14 r35  
    334334
    335335  unsigned char wbuf[] = {0,0,0};
    336  
     336
    337337  if (!(hv>=0.0 && hv<=0X3FFF)) {
    338338    fprintf(fptr," Error: HV beyond limits [0 - 0x3FFF]\n");
    339339    return 0;
    340340  }
     341 
    341342
    342343  switch (chain) {
  • hvcontrol/src/HVConfig.cc

    r14 r35  
    3636  fTimeOut           = 1.;
    3737  IsDAC              = true;
     38  DACMin             = 11008;
     39  DACMax             = 12496;
     40  HVMin              = 67.0;
     41  HVMax              = 76.0;
    3842  fHVCalibOffset      = -.8;
    3943  fHVCalibSlope       = 0.0064;
     
    9195  ReadCard("CCClient",           fCCClient,          's', f);
    9296  ReadCard("IsDAC",             &str,                's', f);
     97  ReadCard("DACMin",            &DACMin,             'I', f);
     98  ReadCard("DACMax",            &DACMax,             'I', f);
     99  ReadCard("HVMin",             &HVMin,              'f', f);
     100  ReadCard("HVMax",             &HVMax,              'f', f);
    93101  ReadCard("HVCalibOffset",     &fHVCalibOffset,     'f', f);
    94102  ReadCard("HVCalibSlope",      &fHVCalibSlope,      'f', f);
     
    121129  fprintf(fptr," CCClient:          %s\n\n",     fCCClient);
    122130  fprintf(fptr," Set DAC values:    %s\n\n",     IsDAC ? "yes" : "no");
     131  fprintf(fptr," DACMin value:      %d\n\n",     DACMin);
     132  fprintf(fptr," DACMax value:      %d\n\n",     DACMax);
     133  fprintf(fptr," HVMin value:       %f\n\n",     HVMin);
     134  fprintf(fptr," HVMax value:       %f\n\n",     HVMax);
    123135  fprintf(fptr," HVCalibOffset :    %f\n\n",     fHVCalibOffset);
    124136  fprintf(fptr," HVCalibSlope :     %f\n\n",     fHVCalibSlope);
     
    166178  fprintf(f,"CCClient           %s   # Central Control client name\n\n",fCCClient);
    167179  fprintf(f,"IsDAC              %s   # Define here if user input is interpreted as DAC value or voltage\n\n",((IsDAC) ? "TRUE" : "FALSE"));
     180  fprintf(f,"DACMin             %d   # Starting point for calibration of DAC to voltage values\n",DACMin);
     181  fprintf(f,"DACMax             %d   # End point for calibration of DAC to voltage values\n",DACMax);
     182  fprintf(f,"HVMin              %f   # Starting point for calibration of voltage to DAC values\n",HVMin);
     183  fprintf(f,"HVMax              %f   # End point for calibration of voltage to DAC values\n",HVMax);
    168184  fprintf(f,"HVCalibOffset      %f   # Calibration of DAC to voltage values\n",fHVCalibOffset);
    169185  fprintf(f,"HVCalibSlope       %f   # Calibration of DAC to voltage values\n\n",fHVCalibSlope);
  • hvcontrol/src/HVConfig.h

    r14 r35  
    3636  float  fStatusRefreshRate;
    3737
     38  int DACMin;
     39  int DACMax;
     40  float HVMin;
     41  float HVMax;
     42
    3843  float  fHVCalibOffset;
    3944  float  fHVCalibSlope;
  • hvcontrol/src/HVStatus.cc

    r14 r35  
    162162 
    163163  if (status->Socket != -1) // Print status string to socket if open
    164     write(status->Socket,str,strlen(str));
     164    write(status->Socket,str,strlen(str)+1);
    165165
    166166}
  • hvcontrol/src/ProcessIO.cc

    r14 r35  
    2222  status  = new Status;
    2323  config  = new HVConfig(stdout,ConfigFile);
     24  calib  = new HVCalib(config);
    2425  log     = new Log(config->fLogPath);
    2526  hv      = new HV(config->fUSBDevice,config->USBDeviceNumber,stdout);
     27 
     28  pm = new PixelMap("../fact_repos.svn/config/PixelMap.txt");
    2629
    2730  // Initialize status structure (HVStatus.cc/h)
     
    8588  config->WriteHVConfig(stdout,config->FileName);
    8689
    87   if (hv)      delete hv;
    88   if (status)  delete status;
    89   if (config)  delete config;
    90   if (log)     delete log;
     90  delete hv;
     91  delete status;
     92  delete config;
     93  delete log;
     94  delete pm;
    9195 
    9296}
     
    104108  puts(" help                              Print help");
    105109  puts(" hv <ch>|<all> [b][x]<v>           Set chan. <ch>|<all> chan. of active chain(s)/board(s) to <v>");
    106   puts(" hvdiff <ch>|<all> [b][x]<diff>    Set chan. <ch>|<all> chan. of active chain(s)/board(s) to <diff>");
     110  //  puts(" hvdiff <ch>|<all> [b][x]<diff>    Set chan. <ch>|<all> chan. of active chain(s)/board(s) to <diff>");
     111  puts(" hvdiff <PXL id> <diff>            Set HV difference of pixel PXL id to <diff>");
    107112  puts(" list                              List all HV boards");
    108113  puts(" load <file>                       Load HV settings from <file>");
     
    128133int ProcessIO::CommandControl() {
    129134
    130   //  bool IsDAC;
    131   //  float  fHVCalibOffset;
    132   //  float  fHVCalibSlope;
    133   //  float  fHVMaxDiff;
    134 
    135135
    136136  // Adress HV board
     
    340340      }
    341341
    342       if (!(config->IsDAC))
    343         hvoltage=(unsigned int)((hvoltageV-config->fHVCalibOffset)/config->fHVCalibSlope);
    344342
    345343      StopMonitor();
     
    350348        for (int j=status->FirstChain;j<=status->LastChain;j++) {
    351349          if (!allchannels) {
    352             if ((hv->GetHVBoard(i))->SetHV(stdout,j,channel,hvoltage,rbuf,status->Verbose)==1) {
    353              
     350 // Convert from HV to DAC values
     351            if (!(config->IsDAC))
     352              hvoltage = calib->HVToDAC(hvoltageV,i,j,channel);
     353            if ((hv->GetHVBoard(i))->SetHV(stdout,j,channel,hvoltage,rbuf,status->Verbose)==1){
    354354              status->HV[i][j][channel]=hvoltage;
    355               sprintf(str, "Test1   status->HV = %d\n",hvoltage);
    356               DoPrompt(str);
    357355              UpdateStatus(i,rbuf);
    358356             
     
    370368              errors++;
    371369            }
    372 
    373370          }
     371
    374372          else {
    375 
    376373            sprintf(str,"updating board %d chain %d\n",hv->GetHVBoard(i)->GetBoardNumber(),j);
    377374            DoPrompt(str);
    378375           
    379 
    380376            for (int k=0;k<MAX_NUM_CHANNELS;k++) {
     377 // Convert from HV to DAC values
     378              if (!(config->IsDAC))
     379                hvoltage = calib->HVToDAC(hvoltageV,i,j,k);
    381380              if ((hv->GetHVBoard(i))->SetHV(stdout,j,k,hvoltage,rbuf,status->Verbose)==1) {
    382                
    383381                status->HV[i][j][k]=hvoltage;
    384382                UpdateStatus(i,rbuf);
     
    436434    int hvdiff = 0;
    437435    unsigned int hvoltage = 0;
     436    float hvoltageV = 0.0;
    438437    float hvdiffV = 0.0;
    439     int channel = 0;
    440     bool allchannels = FALSE;
     438    std::string pixelname(status->Param[1]);
     439    unsigned int board = 0;
     440    unsigned int chain = 0;
     441    unsigned int channel = 0;
     442
    441443
    442444    if (status->Param[1][0]>0 && status->Param[2][0]>0) {
    443445
     446
     447      // Set board
     448      board = pm->Pixel_to_HVboard(pixelname);
     449      //      std::cout << "Board: " << board << std::endl;
     450      // Set chain
     451      chain = pm->Pixel_to_HVchain(status->Param[1]);
     452      //      std::cout << "Chain: " << chain << std::endl;
    444453      // Set channel
    445       if (IsNoDigit(status->Param[1]))
    446         channel = atoi(status->Param[1]);
    447       else if(status->Param[1][0] == 'a')
    448         allchannels = TRUE;
    449       else {
    450         DoPrompt("error: wrong input format - usage: hvdiff <channel>|<all> <hv difference>\n");
    451         return 0;
    452       }
     454      channel = pm->Pixel_to_HVchannel(status->Param[1]);
     455      //      std::cout << "Channel: " << channel << std::endl;
     456
     457      /*      if (IsNoDigit(status->Param[1]))
     458              channel = atoi(status->Param[1]);
     459              else if(status->Param[1][0] == 'a')
     460              allchannels = TRUE;
     461              else {
     462              DoPrompt("error: wrong input format - usage: hvdiff <channel>|<all> <hv difference>\n");
     463              return 0;
     464        }*/
    453465
    454466      // Binary input
     
    481493        return 0;
    482494      }
    483       else if (hvdiff>0X3FFF) {
    484         DoPrompt("difference of high voltage out of range (Vmin: -16383, Vmax: 16383)!\n");
    485         return 0;
    486       }
    487       else if (hvdiffV>78.0 && (-78.0<hvdiffV)) {
    488         DoPrompt("difference of high voltage out of range (Vmin: -78.0, Vmax: 78.0)!\n");
    489         return 0;
    490       }
    491 
     495      else if (hvdiff>config->DACMax || hvdiff <(-(config->DACMax))) {
     496        sprintf(str,"difference of high voltage [hvdiff:%d] out of range (Vmin: 0.0, Vmax: %d)!\n", hvdiff,config->DACMax);
     497        DoPrompt(str);
     498        return 0;
     499      }
     500      else if (hvdiffV>(calib->DACToHV(config->DACMax,0,0,0))|| hvdiffV<-(calib->DACToHV(config->DACMax,0,0,0))) {
     501        sprintf(str,"difference of high voltage [hvdiff:%f] out of range (Vmin: 0.0, Vmax: %f)!\n",hvdiffV,calib->DACToHV(config->DACMax,0,0,0));
     502        DoPrompt(str);
     503        return 0;
     504      }
     505
     506      //Convert from HV to DAC values
    492507      if (!(config->IsDAC)){
    493         hvdiff=(int)(hvdiffV/config->fHVCalibSlope);
     508        hvoltage = status->HV[board][chain][channel];
     509        hvoltageV = calib->DACToHV(hvoltage,board,chain,channel);
     510        hvoltageV = hvoltageV + hvdiffV;
     511        hvdiff = calib->HVToDAC(hvoltageV,board,chain,channel) - hvoltage;
    494512      }
    495513      StopMonitor();
    496514
    497      
    498       for (int i=status->FirstBoard;i<=status->LastBoard;i++) {
    499 
    500         for (int j=status->FirstChain;j<=status->LastChain;j++) {
    501           if (!allchannels) {
    502             hvoltage = status->HV[i][j][channel];
    503             for (int k=0;k<=abs((int)(hvdiff/config->fHVMaxDiff));k++){
    504               if (k<abs((int)(hvdiff/config->fHVMaxDiff))){
    505                 hvoltage=(unsigned int)(hvoltage + config->fHVMaxDiff*hvdiff/abs(hvdiff));
    506               }
    507               if (k==(int)(abs((int)(hvdiff/config->fHVMaxDiff)))){
    508                 hvoltage=(unsigned int)(hvoltage + (hvdiff%(int)config->fHVMaxDiff));
    509               }
    510 
    511 
    512               status->HV[i][j][channel]=hvoltage;
    513               if ((hv->GetHVBoard(i))->SetHV(stdout,j,channel,hvoltage,rbuf,status->Verbose)==1) {
    514                 UpdateStatus(i,rbuf);
    515                 sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(i)->GetBoardNumber(),j,channel,hvoltage,hvoltage);
    516                 DoPrompt(str);
    517                 if (status->Verbose) {
    518                   sPrintStatus(status,str,i);
    519                   DoPrompt(str);
    520                 }
    521                 sPrintStatus(status,str,i); // Print status only to socket
    522               }
    523               else {
    524                 sprintf(str,"board %d error: could not set hv - check timeout and try again\n",hv->GetHVBoard(i)->GetBoardNumber());
    525                 DoPrompt(str);
    526                 errors++;
    527               }
    528               //            Sleep(1);
    529             }
     515   
     516     
     517      hvoltage = status->HV[board][chain][channel];
     518      for (int k=0;k<=abs((int)(hvdiff/config->fHVMaxDiff));k++){
     519        if (k<abs((int)(hvdiff/config->fHVMaxDiff))){
     520          hvoltage=(unsigned int)(hvoltage + config->fHVMaxDiff*hvdiff/abs(hvdiff));
     521        }
     522        if (k==(int)(abs((int)(hvdiff/config->fHVMaxDiff)))){
     523          hvoltage=(unsigned int)(hvoltage + (hvdiff%(int)config->fHVMaxDiff));
     524        }
     525       
     526       
     527        status->HV[board][chain][channel]=hvoltage;
     528        if ((hv->GetHVBoard(board))->SetHV(stdout,chain,channel,hvoltage,rbuf,status->Verbose)==1) {
     529          UpdateStatus(board,rbuf);
     530          if (k==(int)(abs((int)(hvdiff/config->fHVMaxDiff)))){
     531            sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(board)->GetBoardNumber(),chain,channel,hvoltage,hvoltage);
     532            DoPrompt(str);
     533            sPrintStatus(status,str,board); // Print status only to socket
    530534          }
    531           else {
    532            
    533             sprintf(str,"updating board %d chain %d\n",hv->GetHVBoard(i)->GetBoardNumber(),j);
    534             DoPrompt(str);
    535            
    536 
    537             for (int k=0;k<MAX_NUM_CHANNELS;k++) {
    538               int hvoltage = status->HV[i][j][k];
    539               for (int l=0;l<=abs((int)(hvdiff/config->fHVMaxDiff));l++){
    540                 if (l<abs((int)(hvdiff/config->fHVMaxDiff)))
    541                   hvoltage=(unsigned int)(hvoltage + config->fHVMaxDiff*hvdiff/abs(hvdiff));
    542                 if (l==(int)(abs((int)(hvdiff/config->fHVMaxDiff))))
    543                   hvoltage=(unsigned int)(hvoltage + (hvdiff%(int)config->fHVMaxDiff));
    544                 status->HV[i][j][k]=hvoltage;
    545                 if ((hv->GetHVBoard(i))->SetHV(stdout,j,k,hvoltage,rbuf,status->Verbose)==1) {
    546                
    547                   UpdateStatus(i,rbuf);
    548                
    549                   if (status->Verbose) {
    550                     sprintf(str,"board %d: high voltage of chain %d channel %d set to %d | 0X%.4X\n",hv->GetHVBoard(i)->GetBoardNumber(),j,k,hvoltage,hvoltage);
    551                     DoPrompt(str);
    552                     sPrintStatus(status,str,i);
    553                     DoPrompt(str);
    554                   }
    555                   sPrintStatus(status,str,i); // Print status only to socket
    556                  
    557                 }
    558                 else {
    559                   sprintf(str,"board %d error: could not set HV - check timeout and try again\n",hv->GetHVBoard(i)->GetBoardNumber());
    560                   DoPrompt(str);
    561                   errors++;
    562                 }
    563                 //              Sleep(0.001);
    564               }
    565             }
    566           }
    567         }
    568       }
     535        }
     536        else {
     537          sprintf(str,"board %d chain %d channel %d error: could not set hv - check timeout and try again\n",hv->GetHVBoard(board)->GetBoardNumber(), chain, channel);
     538          DoPrompt(str);
     539          errors++;
     540        }
     541      }          // for loop over k
     542        //          Sleep(1);
     543      if (status->Verbose) {
     544        sPrintStatus(status,str,board);
     545        DoPrompt(str);
     546      }
     547   
     548   
    569549      StartMonitor();
    570550
    571551      if (errors) {
    572         sprintf(str,"warning %d error(s) => check timeout and try again\n",errors);
     552        sprintf(str,"warning %d error(s)\n",errors);
    573553        DoPrompt(str);
    574554      }
     
    579559    }
    580560    else {
    581       sprintf(str,"usage: hvdiff <channel>|<all> <hv difference>\n");
     561      sprintf(str,"usage: hvdiff <PXL id> <hv difference>\n");
    582562      DoPrompt(str);
    583563    }
    584564    return 0;
    585565
    586     }
     566  }
    587567
    588568      // End: Write difference of high voltage --------------------------------------------------------------------
  • hvcontrol/src/ProcessIO.h

    r14 r35  
    2828#include "Log.h"
    2929#include "HVConfig.h"
     30#include "HVCalib.h"
    3031#include "Utilities.h"
    3132#include "HV.h"
     33
     34#include <iostream>
     35#include "../../fact_repos.svn/pixelmap/PixelMap.h"
    3236
    3337
     
    4549  char bdata[16];
    4650
     51  PixelMap *pm;
     52
    4753 public:
    4854 
    4955  HVConfig*    config;
     56  HVCalib*     calib;
    5057  Status*      status;
    5158  Log*         log;
Note: See TracChangeset for help on using the changeset viewer.