⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wave.c

📁 通过软件实现对示波器的模拟
💻 C
字号:

static int PANEL_BGCOLOR;
static int bgcolor;
static int tracecolor;
static int PANEL_TRACECOLOR;
static int screen;
static int PANEL_SCREEN;
static int smooth;
static int PANEL_SMOOTH;
static int PANEL_SHIFT1;
static int PANEL_SHIFT2;
static int wave2form;
static int PANEL_WAVE2FORM;
static int channel;
static int PANEL_CHANNEL;
static int PANEL_SAMPLEFREQUENCY2;
static int PANEL_SAMPLEFREQUENCY1;
static double samplefrequency2;
static double samplefrequency1;
static int shift1;
static int shift2;
static int PANEL_WAVE1FORMS;
static int wave1forms;
static int wave2forms;
static int wave1points;
static int wave2points;
static int PANEL_PHASE1;
static int PANEL_PHASE2;
static int PANEL_CYCLES2;
static int PANEL_CYCLES1;
static int panelHandle;
static int PANEL_AMPLITUDE1;
static int PANEL_AMPLITUDE2;
static int panelHandle;
static double mark;
static double wave1[1000000];  
static double waveout1[1000000];
static double waveout2[1000000];
static double wave2[1000000];
static double phase1;
static double phase2;
static double cycles1;
static double cycles2;
static double amplitude1;
static double amplitude2;
#include <cvirte.h>		
#include <userint.h>
#include "wave.h"
#include <ansi_c.h> 
#include <analysis.h> 
#include <utility.h>

void plot1(void);
void plot2(void);

int main (int argc, char *argv[])
{
  if (InitCVIRTE (0, argv, 0) == 0)	/* Needed if linking in external compiler; harmless otherwise */
		return -1;	/* out of memory */
  if ((panelHandle = LoadPanel (0, "wave.uir", PANEL)) < 0)
		return -1;
  GetCtrlVal (panelHandle, PANEL_AMPLITUDE1, &amplitude1);
  GetCtrlVal (panelHandle, PANEL_CYCLES1, &cycles1); 
  GetCtrlVal (panelHandle, PANEL_PHASE1, &phase1); 
  GetCtrlVal (panelHandle, PANEL_WAVE1FORMS, &wave1forms);
  GetCtrlVal (panelHandle, PANEL_SAMPLEFREQUENCY1, &samplefrequency1); 
  GetCtrlVal (panelHandle, PANEL_SHIFT1, &shift1);   
  GetCtrlVal (panelHandle, PANEL_SHIFT2, &shift2);  
  GetCtrlVal (panelHandle, PANEL_AMPLITUDE2, &amplitude2);
  GetCtrlVal (panelHandle, PANEL_CYCLES2, &cycles2); 
  GetCtrlVal (panelHandle, PANEL_PHASE2, &phase2);
  GetCtrlVal (panelHandle, PANEL_WAVE2FORMS, &wave2forms);
  GetCtrlVal (panelHandle, PANEL_SAMPLEFREQUENCY2, &samplefrequency2);
  SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_DATA_MODE,
					  VAL_DISCARD);
  GetCtrlVal (panelHandle, PANEL_SMOOTH, &smooth);		
  SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_SMOOTH_UPDATE, smooth);
  GetCtrlVal (panelHandle, PANEL_TRACECOLOR, &tracecolor);	
  DisplayPanel (panelHandle);
  mark=Timer();
  RunUserInterface ();
  return 0;
}
 
//退出
int CVICALLBACK quitcallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  int confirm;
  switch (event)
    {
     case EVENT_COMMIT:
          confirm=ConfirmPopup("Confirm","Are you sure you want to quit system?");
          if(confirm==1)
	  QuitUserInterface(0);
     break;
     case EVENT_RIGHT_CLICK:
          MessagePopup ("Quit Button Help",
                    "This button quit the programe and close the pannel ");
     break;	
    }
	return 0;
}

//plot的回调函数
int CVICALLBACK plotcallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
  {
   case EVENT_COMMIT:
        GetCtrlVal (panelHandle, PANEL_CHANNEL, &channel); 
        switch (channel) 
	  {
	   case 1:
	        plot1();
	        
	   break;
	   case 2:
	        plot2();
	      
	   break;
	  }
   break;
   case EVENT_RIGHT_CLICK:
        MessagePopup ("Plot Button Help",
                  "This button plot the waveform in the graph");
   break;		
   }			
	return 0;
}

//plot1子函数
void plot1()
{
     wave1points=samplefrequency1*cycles1; 
     switch(wave1forms)
      {
       case 0:
	    SineWave (wave1points, amplitude1,  cycles1/wave1points, &phase1, wave1); 
       break;
       case 1:
        SquareWave (wave1points, amplitude1,  cycles1/wave1points, &phase1, 50.0,
								wave1);
       break;
       case 2:
	    SawtoothWave (wave1points, amplitude1,  cycles1/wave1points, &phase1,
								 wave1);
       break;
        case 3:
	     TriangleWave (wave1points, amplitude1, cycles1/wave1points, &phase1,
								wave1);
        break;
      }

 //平移 
      	
if (shift1>0)
       {
	    Copy1D (wave1, wave1points - shift1, &waveout1[shift1]);
        Copy1D (&wave1[wave1points - shift1], shift1, waveout1);
        Copy1D (waveout1, wave1points, wave1);
       }
    
/***------***/                      
	        
      

   SetCtrlAttribute (panelHandle, PANEL_SHIFT1, ATTR_MAX_VALUE,
						 wave1points-1);
	GetCtrlVal (panelHandle, PANEL_SHIFT1, &shift1);
if (shift1>wave1points-1)
	shift1=wave1points-1;
	SetCtrlVal (panelHandle, PANEL_SHIFT1, shift1);
/***-------***/
	DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);  
	PlotY (panelHandle, PANEL_GRAPH, wave1, wave1points, VAL_DOUBLE,
		   VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1000, tracecolor);        

}

//plot2子函数 
void plot2()
{
 wave2points=samplefrequency2*cycles2;         
 switch (wave2forms)
   {
    case 0:        
	 SineWave (wave2points, amplitude2,  cycles2/wave2points, &phase2, wave2); 
    break;
    case 1:	
	 SawtoothWave (wave2points, amplitude2,  cycles2/wave2points, &phase2,
								 wave2);
    break;
    case 2:        
	 Ramp (wave2points, 0.0, 1.0, wave2);
    break;
   }
//平移      
if (shift2>0)
       {
        Copy1D (wave2, wave2points - shift2, &waveout2[shift2]);
        Copy1D (&wave2[wave2points - shift2], shift2, waveout2);
        Copy1D (waveout2, wave2points, wave2);
       }              

SetCtrlAttribute (panelHandle, PANEL_SHIFT2, ATTR_MAX_VALUE,
						 wave2points-1);
GetCtrlVal (panelHandle, PANEL_SHIFT2, &shift2);
if (shift2>wave2points-1)
shift2=wave2points-1;
SetCtrlVal (panelHandle, PANEL_SHIFT2, shift2);
	   
  DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
   PlotY (panelHandle, PANEL_GRAPH, wave2, wave2points, VAL_DOUBLE,
		   VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1000, tracecolor); 
     
}
/***通道1的幅值选择 ***/
int CVICALLBACK amplitude1callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{	
 switch (event)
   {
    case EVENT_VAL_CHANGED:
	 GetCtrlVal (panelHandle, PANEL_AMPLITUDE1, &amplitude1);
	 SetCtrlVal (panelHandle, PANEL_AMPLITUDE1, amplitude1);
       plot1();    
    break;
   }
	return 0;
}

/***取得周期数***/
int CVICALLBACK cycles1callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
     {
      case EVENT_VAL_CHANGED:
	   GetCtrlVal (panelHandle, PANEL_CYCLES1, &cycles1);
	   SetCtrlVal (panelHandle, PANEL_CYCLES1, cycles1);    
	   plot1();    
      break;	    
     }
	return 0;
}

/***取得相位角***/
int CVICALLBACK phase1callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_VAL_CHANGED:
	  GetCtrlVal (panelHandle, PANEL_PHASE1, &phase1);
	  SetCtrlVal (panelHandle, PANEL_PHASE1, phase1);
    plot1();    
     break;
    }
	return 0;
}

/***通道1的波形选择 ***/ 
int CVICALLBACK wave1formscallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
   switch (event)
     {
      case EVENT_VAL_CHANGED:
	   GetCtrlVal (panelHandle, PANEL_WAVE1FORMS, &wave1forms);			 
	   plot1();
	   break;
     }
	return 0;
}

//通道1的采样频率
int CVICALLBACK samplefrequency1callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
   switch (event)
     {
      case EVENT_VAL_CHANGED:
	   GetCtrlVal (panelHandle, PANEL_SAMPLEFREQUENCY1, &samplefrequency1);
           SetCtrlVal (panelHandle, PANEL_SAMPLEFREQUENCY1, samplefrequency1);
           break;
     }
	return 0;
}
//通道选择?
int CVICALLBACK channelcallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
   switch (event)
     {
      case EVENT_COMMIT:
	   GetCtrlVal (panelHandle, PANEL_CHANNEL, &channel);
      break;
      case EVENT_RIGHT_CLICK:
           MessagePopup ("Channel Button Help",
                  "This button select the channel for waveform");
      break;		
     }
	return 0;
}

/***通道2的波形选择 ***/
int CVICALLBACK wave2formscallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
	  GetCtrlVal (panelHandle, PANEL_WAVE2FORMS, &wave2forms);
	  plot2();
     break;
     }
	return 0;
}

/***得到幅值 ***/
int CVICALLBACK amplitude2callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
          GetCtrlVal (panelHandle, PANEL_AMPLITUDE2, &amplitude2);
	      SetCtrlVal (panelHandle, PANEL_AMPLITUDE2, amplitude2);
	      plot2();
     break;
     }
	return 0;
}

/***取得相位角***/
int CVICALLBACK phase2callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
	      	GetCtrlVal (panelHandle, PANEL_PHASE2, &phase2);
	  		SetCtrlVal (panelHandle, PANEL_PHASE2, phase2);
	  		plot2();
     break;
    }
	return 0;
}
//得到通道2的采样频率
int CVICALLBACK samplefrequency2callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
          	GetCtrlVal (panelHandle, PANEL_SAMPLEFREQUENCY2, &samplefrequency2);
	  		SetCtrlVal (panelHandle, PANEL_SAMPLEFREQUENCY2, samplefrequency2);
		      
     break;
     }
	return 0;
}

/***获得波形的周期数***/
int CVICALLBACK cycles2callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
	  		GetCtrlVal (panelHandle, PANEL_CYCLES2, &cycles2);
	  		SetCtrlVal (panelHandle, PANEL_CYCLES2, cycles2);
          	plot2();
     break;
    }
	return 0;
}

//  刷新功能每秒刷新一次
int CVICALLBACK updatecallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_TIMER_TICK:
	  		GetCtrlVal (panelHandle, PANEL_CHANNEL, &channel);
	  switch (channel)
	    {
	     case 1:
	          plot1();
             break;
         case 2:
		     plot2();
             break;
	     }

	     
     break;
     }
	return 0;
}

//得到通道1的偏移量shift1
int CVICALLBACK shift1callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_VAL_CHANGED:
	  GetCtrlVal (panelHandle, PANEL_SHIFT1, &shift1);
	  plot1();
     break;
     }
	return 0;
}

//得到通道2的偏移量shift2
int CVICALLBACK shift2callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{

  switch (event)
    {
     case EVENT_COMMIT:
          GetCtrlVal (panelHandle, PANEL_SHIFT2, &shift2);
          plot2();
     break;
    }
	return 0;
}
//打开
int CVICALLBACK Openfilecall (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:

			break;
		}
	return 0;
}

//存盘
int CVICALLBACK SaveData(int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
    static char pathname[MAX_PATHNAME_LEN], dirname[MAX_PATHNAME_LEN];
    int status, num,i ;
    static FILE *file_handle;
    switch (event) 
      {
       case EVENT_COMMIT:
            GetProjectDir (dirname);
            status = FileSelectPopup (dirname, "datafile.dat",
                                  "Datafiles (*.dat)", "DataFile Storage",
                                  VAL_SAVE_BUTTON, 0, 1, 1, 1, pathname);
            if (status != VAL_NO_FILE_SELECTED)
             {
                file_handle = fopen (pathname, "w+");
                fprintf (file_handle, "OSCILLOSCOPE DEMO DATA FILE \n\n");
                fprintf(file_handle, "Channel Acquired: CH%d\n", channel);
                fprintf(file_handle, "Date %s   Time: %s \n", DateStr(), TimeStr());
                fprintf (file_handle, "----------------------------------\n");
                for (i=0;i<samplefrequency1*cycles1;i++)
                    num = fprintf (file_handle, "%f\n", wave1[i]);
                for (i=0;i<samplefrequency2*cycles2;i++)
				    num = fprintf (file_handle, "%f\n", wave2[i]); 
                fclose (file_handle);
             }
       break;
       case EVENT_RIGHT_CLICK:
            MessagePopup ("Save Button Help",
                  "This button saves the waveform to a data file");
       break;
      }
    return(0);
}

//平滑功能
int CVICALLBACK smoothcallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
	  GetCtrlVal (panelHandle, PANEL_SMOOTH, &smooth);
	  SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_SMOOTH_UPDATE, smooth);
     break;
     }
	return 0;
}

//清屏
int CVICALLBACK screencallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_COMMIT:
	  GetCtrlVal (panelHandle, PANEL_SCREEN, &screen);      
      switch(screen)
            { 
	     case 0:
		  DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);   
		  SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_REFRESH_GRAPH, 1);
	     break;
	     case 1:
		  SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_REFRESH_GRAPH, 0);
	     break;
             }

     break;
     }
	return 0;
}

//线条颜色选择
int CVICALLBACK tracecolorcallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_VAL_CHANGED:
	  GetCtrlVal (panelHandle, PANEL_TRACECOLOR, &tracecolor);			 
     break;
    }
	return 0;
}

//背景颜色设置
int CVICALLBACK bgcolorcallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
  switch (event)
    {
     case EVENT_VAL_CHANGED:
	  GetCtrlVal (panelHandle, PANEL_BGCOLOR, &bgcolor);
          if(bgcolor==VAL_BLACK)
	    SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_GRID_COLOR,
								VAL_WHITE);
	  else
	    SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_GRID_COLOR,
								VAL_BLACK);
	    SetCtrlAttribute (panelHandle, PANEL_GRAPH, ATTR_PLOT_BGCOLOR,
								bgcolor);			  			 
     break;
     }
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -