Subversion Repositories f9daq

Rev

Rev 256 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <ansi_c.h>
#include <utility.h>
#include <gpib.h>
#include "prologix.h"
#include "K617.h"

K617STATUS K617Stat;
static int K617_Interface,K617_Port,K617_Gdev;
static int iret;

void GpibError(char *msg) {

  printf ("%s\n", msg);

  printf ("ibsta = &H%x  <", ibsta);
  if (ibsta & ERR )  printf (" ERR");
  if (ibsta & TIMO)  printf (" TIMO");
  if (ibsta & END )  printf (" END");
  if (ibsta & SRQI)  printf (" SRQI");
  if (ibsta & RQS )  printf (" RQS");
  if (ibsta & CMPL)  printf (" CMPL");
  if (ibsta & LOK )  printf (" LOK");
  if (ibsta & REM )  printf (" REM");
  if (ibsta & CIC )  printf (" CIC");
  if (ibsta & ATN )  printf (" ATN");
  if (ibsta & TACS)  printf (" TACS");
  if (ibsta & LACS)  printf (" LACS");
  if (ibsta & DTAS)  printf (" DTAS");
  if (ibsta & DCAS)  printf (" DCAS");
  printf (" >\n");

  printf ("iberr = %d", iberr);
  if (iberr == EDVR) printf (" EDVR <DOS Error>\n");
  if (iberr == ECIC) printf (" ECIC <Not Controller-In-Charge>\n");
  if (iberr == ENOL) printf (" ENOL <No Listener>\n");
  if (iberr == EADR) printf (" EADR <Address error>\n");
  if (iberr == EARG) printf (" EARG <Invalid argument>\n");
  if (iberr == ESAC) printf (" ESAC <Not System Controller>\n");
  if (iberr == EABO) printf (" EABO <Operation aborted>\n");
  if (iberr == ENEB) printf (" ENEB <No GPIB board>\n");
  if (iberr == EOIP) printf (" EOIP <Async I/O in progress>\n");
  if (iberr == ECAP) printf (" ECAP <No capability>\n");
  if (iberr == EFSO) printf (" EFSO <File system error>\n");
  if (iberr == EBUS) printf (" EBUS <Command error>\n");
  if (iberr == ESTB) printf (" ESTB <Status byte lost>\n");
  if (iberr == ESRQ) printf (" ESRQ <SRQ stuck on>\n");
  if (iberr == ETAB) printf (" ETAB <Table Overflow>\n");

  printf ("ibcntl = %ld\n", ibcntl);
  printf ("\n");

  /* Call ibonl to take the device and interface offline */
  ibonl (K617_Gdev,0);

  exit(1);
}

void _VI_FUNC K617_open (int interface, int port, int primary_addr,
                         int secondary_addr, int timeout)
{
  char cmd[100];
/*
  K617_Gdev = OpenDev ("GPIB0", "");
  if (ibsta & ERR) GpibError("OpenDev Error");
  iret = ibpad (K617_Gdev, 0);
  if (ibsta & ERR) GpibError("OpenDev Error");
  iret = ibsad (K617_Gdev, NO_SAD);
  iret = ibtmo (K617_Gdev, T10s);
  iret = ibeot (K617_Gdev, 1);
  iret = ibeos (K617_Gdev, 0);
*/

  K617_Interface=interface;
  K617_Port=port;
  switch (K617_Interface){
    case 1:
      PROLOGIX_Open (K617_Port);
      sprintf(cmd,"++addr %0d",primary_addr);
      PROLOGIX_Send (cmd);
      PROLOGIX_Send ("++auto 0");
      PROLOGIX_Send ("++eoi 1");
      PROLOGIX_Send ("++eot_enable 0");
      PROLOGIX_Send ("++read_tmo_ms 1000");
      break;
    default:
      K617_Gdev = ibdev(K617_Port,primary_addr,secondary_addr,timeout,1,0);
      if (ibsta & ERR) GpibError("OpenDev Error");
  }
  Delay(GDELAY);  
  return;  
}

void _VI_FUNC K617_clear (void)
{
  switch (K617_Interface){
    case 1:
      PROLOGIX_Send("++clr");
      break;
    default:
      iret = ibclr (K617_Gdev); // Clear the device
      if (ibsta & ERR) GpibError("OpenDev Error");
  }
//  Delay(GDELAY);  
  Delay(2.);
  return;  
}

void _VI_FUNC K617_send (char *cmd, int len)
{
  switch (K617_Interface){
    case 1:
      PROLOGIX_Send(cmd);
      break;
    default:
      iret = ibwrt (K617_Gdev, cmd, len);
      if (ibsta & ERR) GpibError("OpenDev Error");
  }
  Delay(GDELAY);  
  return;  
}

int _VI_FUNC K617_receive (char *response, int maxbyt)
{
  switch (K617_Interface){
    case 1:
      PROLOGIX_Send("++read eoi");
      return PROLOGIX_Receive (response,maxbyt);
      break;
    default:
      iret = ibrd (K617_Gdev, response, maxbyt);
      if (ibsta & ERR) GpibError("OpenDev Error");
      response[ibcntl]=0;
      return ibcntl;    
  }
}

void _VI_FUNC K617_status (void)
{
  int len;
  char cres[100];
 
  K617_send ("U0X", 3);
  len = K617_receive (cres, 90);
  sscanf(cres," 617%1d%2d%1d%1d%1d%1d%1d%1d%1d%1d%1d%2d%1d%2c",
         &K617Stat.function,&K617Stat.range,&K617Stat.zero_check,
         &K617Stat.zero_correct,&K617Stat.suppress,&K617Stat.trigger,
         &K617Stat.vsource_operate,&K617Stat.read_mode,
         &K617Stat.data_prefix,&K617Stat.display,
         &K617Stat.data_store,&K617Stat.srq,&K617Stat.eoi,K617Stat.terminator);
//  printf("617FRRCZNTOBGDQMMKYY\n");
//  printf("%s\n",cres);
//  K617_send ("X", 1);
  return;
}

void _VI_FUNC K617_data_format (int mode)
{
  int len;
  char cmd[100];
 
  len=sprintf(cmd,"G%0dX",mode);
  K617_send (cmd, len);
  return;
}

double _VI_FUNC K617_get (char *prefix, int *loc)
{
  int len;
  double value;
  char cres[100];
 
  K617_send ("X", 1);
  len = K617_receive (cres, 50);
  if (loc) {
    *loc=-1;
    sscanf(cres,"%4c%lg,%d",prefix, &value, loc);
    prefix[4]=0;
  } else {
    sscanf(cres,"%*4c%lg,%*d",&value);
  }
  return value;
}

void _VI_FUNC K617_current_mode (int range)
{
  int len;
  char cmd[100];
 
  len=sprintf(cmd,"F1R%0dX",range);
//  printf("%d, %s\n",len,cmd);
  K617_send (cmd, len);
  Delay(1);
  return;
}

void _VI_FUNC K617_zero_correct (int zcorrect)
{
  K617_send ("C0X", 3);
  K617_send ("Z0X", 3);
  if (zcorrect) {
    K617_send ("C1X", 3);
    Delay(2);
    K617_send ("Z1X", 3);
    K617_send ("C0X", 3);
  }
  return;
}

void _VI_FUNC K617_trigger_mode (int mode)
{
  int len;
  char cmd[100];
 
  len=sprintf(cmd,"T%0dX",mode);
  K617_send (cmd, len);
  return;
}

void _VI_FUNC K617_reading_mode (int mode)
{
  int len;
  char cmd[100];
 
  len=sprintf(cmd,"B%0dX",mode);
  K617_send (cmd, len);
  return;
}

void _VI_FUNC K617_vsource_set (float value)
{
  int len;
  char cmd[100];
 
  value=0.05*floor((value+0.025)/0.05);
  len=sprintf(cmd,"V%+0.2fX",value);
//  printf("%d, %s\n",len,cmd);
  K617_send (cmd, len);
  return;
}

double _VI_FUNC K617_vsource_get (void)
{
  double value;
 
  K617_reading_mode (4);
  value = K617_get (NULL, NULL);
  K617_reading_mode (0);
  return value;    
}

void _VI_FUNC K617_vsource_operate (int operate)
{

  if (operate)
    K617_send ("O1X", 3);
   else
    K617_send ("O0X", 3);
   
  return;  
}

void _VI_FUNC K617_close (void)
{
//  iret = CloseDev (K617_Gdev);
  switch (K617_Interface){
    case 1:
      PROLOGIX_Close();
      break;
    default:
     iret = ibonl(K617_Gdev, 0);// Take the device offline
     if (ibsta & ERR) GpibError("OpenDev Error");
  }
  return;
}

void _VI_FUNC K617_test (void)
{
        int i;
  double value;
  char cres[100];

  K617_clear ();
  K617_current_mode (4);
  K617_zero_correct (1);
  K617_data_format (0);
  K617_trigger_mode (1);
  K617_vsource_set (-100.);
  K617_vsource_operate (1);

  K617_status();

  value=K617_get(cres,&i);
  printf("%s, %lg, %d\n",cres,value,i);
  value=K617_vsource_get();
  printf("%lg\n",value);
  value=K617_get(cres,&i);
  printf("%s, %lg, %d\n",cres,value,i);
  value=K617_get(cres,&i);
  printf("%s, %lg, %d\n",cres,value,i);
  value=K617_get(cres,&i);
  printf("%s, %lg, %d\n",cres,value,i);
  value=K617_get(cres,&i);
  printf("%s, %lg, %d\n",cres,value,i);
  Delay(5);
  K617_vsource_operate (0);
 

}      

#ifdef K617_MAIN

#include <cvirte.h>
#include <userint.h>
#include "K617-ctrl.h"
int pnl; int gLogToFile;
int vmon[4]={P1_VMON_1};
int imon[4]={P1_IMON_1 };
int vset[4]={P1_U_1 };
int iset[4]={P1_I_1 };
int radiob[4]={P1_BOX_1 };

int cvcc[4]={P1_CVCC_1 };
const unsigned char Pre_1 = 1;
int gMask=0xF;

int pnl;
FILE *gFp;
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                           LPSTR lpszCmdLine, int nCmdShow)
{
    char cres[100];
  double Voltage, Current, tinterval;
  if (InitCVIRTE (hInstance, 0, 0) == 0) return -1;    /* out of memory */
                SetStdioPort (CVI_STDIO_WINDOW);
        if ((pnl = LoadPanel (0, "K617-ctrl.uir", P1)) < 0) return -1;  
       
        K617_open (1,4,3,0,13);
         
 
  SetCtrlVal(pnl, P1_ONOFF, 0);
  GetCtrlVal(pnl, P1_TINTERVAL, &tinterval);
  SetCtrlAttribute (pnl, P1_TIMER, ATTR_INTERVAL, tinterval);
 
  for (unsigned char  ch=0;ch<1;ch++){
    int ison,i;
                Voltage =K617_vsource_get();
    Current =K617_get(cres,&i);
    SetCtrlVal(pnl, vset[ch], Voltage);
    SetCtrlVal(pnl, iset[ch], Current);
    GetCtrlVal(pnl, radiob[ch], &ison);
    gMask = ison;
  }
         
  DisplayPanel (pnl);
        RunUserInterface ();
        DiscardPanel (pnl);
  K617_close();  

   if (gFp)  fclose(gFp);
         

  return 0;
}




int CVICALLBACK SwitchOnOffCB (int panel, int control, int event,
                               void *callbackData, int eventData1, int eventData2)
{
  unsigned char state;
  switch (event)
  {
    case EVENT_COMMIT:
      GetCtrlVal(panel, control, &state);
                        K617_vsource_operate (state);
      break;
  }
  return 0;
}

int CVICALLBACK SetCB (int panel, int control, int event,
                       void *callbackData, int eventData1, int eventData2)
{
 
  char cres[100];
        int i;
  switch (event)
  {
    case EVENT_COMMIT:
       
      for (unsigned char ch = 0; ch<1;ch++){
        //printf("ch %d %x\n", ch, gMask);
        if (gMask){
          double Voltage;
          double Current;
          GetCtrlVal(panel, vset[ch], &Voltage);
          GetCtrlVal(panel, iset[ch], &Current);
          printf("->ch %d VSet %g Iset %g\n", ch, Voltage, Current);
                                       
                                        K617_vsource_set (Voltage);
                                        Voltage=K617_vsource_get();
                                       
          // TMI_Current(TMI_DeviceId, ch+1, Pre_1, Current);
                                        Current=K617_get(cres,&i);  
          printf("<-ch %d VSet %g Iset %g\n", ch, Voltage, Current);  
         
        }
      }  
      break;
  }
  return 0;
}

int CVICALLBACK ReadCB (int panel, int control, int event,
                        void *callbackData, int eventData1, int eventData2)
{
 
   int iRet;
         char ch=0;
         double Voltage;
   double Current;
         char cv_cc;
         char cres[100];  
         
  switch (event)
  {
    case EVENT_COMMIT:
      for (ch = 0; ch<1;ch++){
        if (gMask){
          int ison,i;
                      Voltage =K617_vsource_get();
          Current =K617_get(cres,&i);
                                        cv_cc   = 1;
          printf("ch %d VSet %g Iset %g\n", ch, Voltage, Current);
          SetCtrlVal(panel, vmon[ch], Voltage);
          SetCtrlVal(panel, imon[ch], Current);
          SetCtrlVal(panel, cvcc[ch], cv_cc);
        }
      }  
      break;
  }
  return 0;
}

int CVICALLBACK SetIntervalCB (int panel, int control, int event,
                               void *callbackData, int eventData1, int eventData2) {
  double tinterval;
  switch (event) {
    case EVENT_COMMIT:
      GetCtrlVal(panel, control, &tinterval);
      SetCtrlAttribute (panel, P1_TIMER, ATTR_INTERVAL, tinterval);
      break;
  }
  return 0;
}

int CVICALLBACK TimerOnOffCB (int panel, int control, int event,
                              void *callbackData, int eventData1, int eventData2)
{
  int state;
  switch (event)
  {
    case EVENT_COMMIT:
      GetCtrlVal(panel, control, &state);
      if (state){
         ResumeTimerCallbacks();
      } else {
         SuspendTimerCallbacks ();
         printf ("Disabling timer....\n");
      }
      break;
  }
  return 0;
}

int CVICALLBACK ExitCB (int panel, int control, int event,
                        void *callbackData, int eventData1, int eventData2)
{
  switch (event)
  {
    case EVENT_COMMIT:
      QuitUserInterface(0);
      break;
  }
  return 0;
}

int CVICALLBACK SetMaskCB (int panel, int control, int event,
                           void *callbackData, int eventData1, int eventData2)
{ int ison;
  switch (event)
  {
    case EVENT_COMMIT:
      GetCtrlVal(panel, control, &ison);
      for (int i=0;i<1;i++) if (control == radiob[i]) break;
      gMask = ison;
      break;
  }
  return 0;
}


int CVICALLBACK LogToFileCB (int panel, int control, int event,
                             void *callbackData, int eventData1, int eventData2)
{
 
  switch (event)
  {
    case EVENT_COMMIT:
      GetCtrlVal(panel, control, &gLogToFile);
     
      break;
  }
  return 0;
}

int CVICALLBACK TimerCB (int panel, int control, int event,
                         void *callbackData, int eventData1, int eventData2)
{
  switch (event)
  {
     
      unsigned char   ch;
      double current[4];
      double voltage;
      char cv_cc = 0;
                        char cres[100];
                        int i=0;
    case EVENT_TIMER_TICK:
      for (ch = 0; ch<1;ch++){
        if (gMask){
          voltage =K617_vsource_get();
          current[ch] =K617_get(cres,&i);
                                       
          if (gLogToFile){
              if (!gFp)  {
                gFp= fopen("K617.log","w");
                fprintf(gFp,"#time\tch\tU\tI\tCV_CC\n");
              }  
              fprintf(gFp,"%ul\t%d\t%g\t%g\t%d\n",  time(NULL), ch+1, voltage, current[ch], cv_cc);
          }
        }
      }
      PlotStripChart (panel, P1_GRAPH, current, 1, 0, 0, VAL_DOUBLE);
                        PlotStripChart (panel, P1_GRAPH_1, &voltage, 1, 0, 0, VAL_DOUBLE);
      break;
  }
  return 0;
}

int CVICALLBACK TestCB (int panel, int control, int event,
                                                                                                void *callbackData, int eventData1, int eventData2) {
        switch (event) {
                case EVENT_COMMIT:
                        K617_test();
                        break;
        }
        return 0;
}

#endif