Subversion Repositories f9daq

Rev

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

//==============================================================================
//
// Title:   RedPitaya.c
// Purpose:   A short description of the implementation.
//
// Created on:  27. 01. 2017 at 13:29:33 by Samo Korpar.
// Copyright: . All Rights Reserved.
//
//==============================================================================

//==============================================================================
// Include files

//#include "RedPitaya.h"
#include "RedPitaya_ui.h"
#include <userint.h>
#include <ansi_c.h>
#include <utility.h>
#include <visa.h>
#include <cvirte.h>

//==============================================================================
// Constants

#define MAX_THREADS 10
#define NSAMPLES 2048
#define NBEFORE 80
#define NGROUP 32
#define MAXSAMPLES 16384
#define MINTRGDELAY -8192
#define MAXTDCCH 0x80

//==============================================================================
// Types

//==============================================================================
// Static global variables

static int daq_on = 0;
static int ntics;
static int poolHandle = 0;
static int p1h, pID, rID, tfID;
static int ph_tdc, ph_wf;
static int dtdc[MAXTDCCH];
static int debugOut = 0;
static time_t t0;
static ViStatus istat;
static ViSession RedPHandle,RMHandle;

//==============================================================================
// Static functions

static int update_plots (void) {
  if (ph_tdc>0) DeleteGraphPlot (p1h, P1_TDC_G, ph_tdc, VAL_DELAYED_DRAW);
  ph_tdc = PlotY (p1h, P1_TDC_G, &dtdc[0], MAXTDCCH, VAL_INTEGER,
                  VAL_VERTICAL_BAR, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
  return (0);
}



static int export_data (void) {
  char filename[0xFF],rootcmd[0xFF];
  int type=0;
  int neve;
  GetCtrlVal(p1h,P1_FILENAME_EN,filename);
  GetCtrlVal(p1h,P1_FILETYPE,&type);
  unsigned int hdr[10];
  time_t t;
  hdr[0] = 0x1;
  hdr[1] = sizeof(int) * MAXTDCCH;
  hdr[2] = t0;
  GetCtrlVal (p1h, P1_CEVE_N, &neve);
  hdr[3] = neve;
  hdr[4] = (unsigned int)( time(&t)-t0);
  FILE *fp;
  switch (type) {
    case 0:
    case 1:
      fp  =fopen(filename,"wb");
      if (fp) {
        fwrite(hdr,sizeof(unsigned int),5,fp);
        fwrite(dtdc,sizeof(int),MAXTDCCH,fp);
        fclose(fp);
        if (type) {
          sprintf(rootcmd ,"root.exe plottdc.cxx(\\\"%s\\\")", filename);
          LaunchExecutable(rootcmd);

        }
      }
      break;
    case 2:
      fp=fopen(filename,"w");
      if (fp) {
        for (int i=0; i<MAXTDCCH; i++) fprintf(fp,"%d\n", dtdc[i]);
        fclose(fp);
      }
      break;

  }


  return (0);
}
static int CVICALLBACK daq_run(void *functionData) {
  int trgdly,neve,ieve,ndata;
  float data[10000];
  char datac[100000];
  char *ctoken_p;
  char response[80];
  time_t t;
  response[0] = 0;
  t0 = time(&t);
  if (RedPHandle) {
    istat = viPrintf (RedPHandle, "ACQ:RST\r\n");
    istat = viPrintf (RedPHandle, "ACQ:AVG OFF\r\n");
    istat = viPrintf (RedPHandle, "ACQ:DEC 1\r\n");
    istat = viPrintf (RedPHandle, "ACQ:TRIG:LEV -0.03\r\n");
    trgdly = MINTRGDELAY + NSAMPLES - NBEFORE + 1;
    istat = viPrintf (RedPHandle, "ACQ:TRIG:DLY %0d\r\n", trgdly);
    istat = viPrintf (RedPHandle, "ACQ:START\r\n");
    Delay(0.01);
    istat = viPrintf (RedPHandle, "ACQ:TRIG CH1_NE\r\n");
//  istat = viPrintf (RedPHandle, "ACQ:TRIG NOW\r\n");
  }
  GetCtrlVal (p1h, P1_NEVE_N, &neve);
  ieve=0;
  do {
    while (VI_TRUE) {
      if (RedPHandle) istat = viQueryf (RedPHandle, "ACQ:TRIG:STAT?\r\n", "%s",response);
      if (response[0]=='T') break;
      if (!daq_on) break;
    }
    if (!daq_on) break;
    if (RedPHandle) {
      istat = viQueryf (RedPHandle, "ACQ:SOUR1:DATA:LAT:N? %0d\r\n", "%s", NSAMPLES, datac);
      istat = viPrintf (RedPHandle, "ACQ:START\r\n");
      Delay(0.001);
      istat = viPrintf (RedPHandle, "ACQ:TRIG CH1_NE\r\n");
//    istat = viPrintf (RedPHandle, "ACQ:TRIG NOW\r\n");
//    Delay(0.01);
    }
    ndata=0;
    ctoken_p = strtok (datac, "{,}\r");
    while (ctoken_p) {
      sscanf(ctoken_p,"%f",&data[ndata]);
      if ((ndata)&&(data[ndata]<-0.015)&&(data[ndata-1]>=-0.015)) dtdc[ndata/NGROUP]++;
      ctoken_p = strtok (NULL, "{,}\r");
      ndata++;
    }
    ph_wf = PlotY (p1h, P1_WF_G, data, ndata, VAL_FLOAT, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1, VAL_BLUE);
    SetCtrlVal (p1h, P1_CEVE_N, ++ieve);
    if (debugOut) {
      sprintf(response,"%d, %d",ieve,ndata);
      istat = InsertTextBoxLine (p1h, P1_IO_TB, -1, response);
      debugOut=0;
    }
  } while (ieve<neve);
  daq_on=0;
  SetCtrlVal (p1h, P1_DAQ_S, daq_on);
  SetCtrlVal (p1h, P1_CEVE_N, ieve);
  return 0;
}

//==============================================================================
// Global variables

//==============================================================================
// Global functions

/// HIFN  What does your function do?
/// HIPAR x/What inputs does your function expect?
/// HIRET What does your function return?

int CVICALLBACK cb_timer (int panel, int control, int event, void *callbackData,
                          int eventData1, int eventData2) {
  QueueUserEvent (9000, p1h, P1_TIMER_T);
  return (0);
}

int CVICALLBACK debug_pressed (int panel, int control, int event,
                               void *callbackData, int eventData1, int eventData2) {
  switch (event) {
    case EVENT_COMMIT:
      debugOut=1;
      break;
  }
  return 0;
}

int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow) {
  int i,refon,dummy;
  char response[80];

  if (InitCVIRTE (hInstance, 0, 0) == 0)
    return -1;    /* out of memory */

  SetSleepPolicy(VAL_SLEEP_MORE);
  CmtNewThreadPool (MAX_THREADS, &poolHandle);

  SetStdioWindowOptions (1000, 0, 0);
  SetStdioWindowSize (150, 600);
  SetStdioWindowPosition (825, 20);

  istat = viOpenDefaultRM (&RMHandle);
  if (RMHandle) istat = viOpen (RMHandle, "TCPIP0::178.172.43.91::5000::SOCKET", VI_NULL, VI_NULL, &RedPHandle);
  if (RedPHandle){
  istat = viSetAttribute (RedPHandle, VI_ATTR_TCPIP_KEEPALIVE, VI_TRUE);
  istat = viSetAttribute (RedPHandle, VI_ATTR_TCPIP_NODELAY, VI_TRUE);
  istat = viSetAttribute (RedPHandle, VI_ATTR_TERMCHAR, '\n');
  istat = viSetAttribute (RedPHandle, VI_ATTR_TERMCHAR_EN, VI_TRUE);
  istat = viSetAttribute (RedPHandle, VI_ATTR_TMO_VALUE, 1000);
  }
  if ((p1h = LoadPanel (0, "RedPitaya_ui.uir", P1)) < 0) return -1;
  DisplayPanel (p1h);
  istat = SetCtrlAttribute (p1h, P1_WF_G, ATTR_DATA_MODE, VAL_DISCARD);

  if (RedPHandle) istat = viQueryf (RedPHandle, "*IDN?\r\n", "%s",response);
  else sprintf(response,"Connection to RedPitaya is missing");
  istat = InsertTextBoxLine (p1h, P1_IO_TB, -1,response);
  istat = ProcessDrawEvents ();

  QueueUserEvent (1000, p1h, P1_RESET_PB);

  do {
    GetUserEvent (1, &pID, &rID);
    switch (rID) {
      case P1_TIMER_T:
        ntics+=1;
        GetCtrlVal (p1h, P1_REFON_CB, &refon);
        if (refon) update_plots();
        break;
      case P1_REFRESH_PB:
        update_plots();
        break;
      case P1_DAQ_S:
        GetCtrlVal (p1h, P1_DAQ_S, &daq_on);
        if (daq_on) {
          CmtScheduleThreadPoolFunction (poolHandle, daq_run, (void *)&dummy, &tfID);
        } else {
          CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID,
                                                  OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
          CmtReleaseThreadPoolFunctionID (poolHandle, tfID);
        }
        break;
      case P1_RESET_PB:
        for (i=0; i<MAXTDCCH; i++) {
          dtdc[i]=0;
        }
        update_plots();
      case P1_CLEAR_PB:
        DeleteGraphPlot (p1h, P1_WF_G, -1, VAL_IMMEDIATE_DRAW);
        break;

      case P1_EXPORT_PB:
        export_data();
        break;
      case P1_TDCLOG_S:
        GetCtrlVal (p1h, P1_TDCLOG_S, &istat);
        SetCtrlAttribute (p1h, P1_TDC_G, ATTR_YMAP_MODE, istat);
        update_plots();
        break;
      default:
        Delay(1.);
    }
  } while ((rID != P1_EXIT_PB)||daq_on);

  CmtDiscardThreadPool (poolHandle);
  DiscardPanel (p1h);

  if (RedPHandle) istat = viClose (RedPHandle);
  if (RMHandle) istat = viClose (RMHandle);

  return 0;
}