示例#1
0
//---------------------------------------------------------
// работа с ЦАП
//---------------------------------------------------------
int DacPanel(void)
{
	int Pnl;
	int i, j, key, hnd, cnt;
   static int SignalType=0;
	char *UirName="demo.uir";
	char *SignalTypeName[]=
   			{
            	{"Постоянный"},
					{"Синус"},
					{"Меандр"},
					{"Пила"},
					{"Треугольный"}
				};

	// Загрузим панель
	Pnl=LoadPanel(UirName, DACPARAM);

	InitDac(Pnl);

	// покажем название платы в заголовке панели
	ShowNameInTitle(Pnl);

	SetCtrlVal(Pnl, P(BOX), "В данном примере программа по клавише 'СТАРТ ЦАП' \nзапускает ЦАП с заданными параметрами.");
	SetCtrlVal(Pnl, P(DAC_NUMBER), DAC_Number);
	SetCtrlVal(Pnl, P(DAC_RATE), DAC_Rate);
	SetCtrlVal(Pnl, P(SIGNAL_TYPE), SignalType);
	SetCtrlVal(Pnl, P(AMPLITUDE), Amplitude);
	{
		double FREQ=DAC_Rate/(double)DacFifoLength;
		if(Frequency/FREQ < 0.5)
			Frequency=FREQ;
		else
			Frequency=FREQ*(int)((Frequency/FREQ)+0.5);
	}
	SetCtrlVal(Pnl, P(FREQUENCY), Frequency);

	// Отобразим панель на экpане дисплея
	DisplayPanel(Pnl);

	KeyFlag=0;
	for(key=0; !key;)
	{
		if(KeyFlag)
		{
			KeyFlag=0;
			if(KeyCode == 0x1B)
			{
				*KeybPtr1 = *KeybPtr2;
				if(ConfirmPopup("Вы желаете выйти?"))
				{
					UnloadPanel(Pnl);
					return EXIT;
				}
				KeyFlag=0;
			}
		}

		GetUserEvent(0, &hnd, &cnt);

  		// Выбpан пункт меню
  		if(hnd==Bar)
		{
			if(cnt!=-1)
			{
				switch(cnt)
				{
					case B(ADC):
					{
						int result=AdcParamPanel();
						if(result == DISK_PANEL)
						{
							UnloadPanel(Pnl);
							return DISK_PANEL;
						}
						else if(result == INPUT_PANEL)
						{
							UnloadPanel(Pnl);
							return INPUT_PANEL;
						}
						break;
					}

					case B(DAC):
						break;

      			case B(TTL):
						UnloadPanel(Pnl);
           			return TTL_PANEL;

      			case B(QUIT):
						if(ConfirmPopup("Вы желаете выйти?"))
                  {
							UnloadPanel(Pnl);
							return EXIT;
                  }
          	}
			}
	 	}

  		// Выбpана опция на панели
  		if(hnd == Pnl)
    	{
			switch(cnt)
			{
				case P(START):
            {
               char str[200];

				   // запретим работу ЦАП
					if(!ENABLE_DAC_STREAM_PLX(&bi[0], 0))
				   {
						SetCtrlVal(Pnl, P(BOX), " Не выполнена функция ENABLE_DAC_STREAM_PLX()!");
						SetMenuBarAttribute(B(DAC), ATTR_MENU_BAR_ENABLED, DISABLE);
						SetCtrlAttribute(Pnl, P(START), ATTR_CTRL_ENABLED, DISABLE);
						break;
				   }
					// сформируем данные для буфера ЦАП
					MakeDacBuffer(SignalType);
					// положим сформированные данные в память программ DSP в буфер ЦАП
					PUT_PM_ARRAY_PLX(&bi[0], DacFifoBaseAddress, 2*DacFifoLength, Buffer);
					// разрешим работу ЦАП
					if(!ENABLE_DAC_STREAM_PLX(&bi[0], 1))
					{
						SetCtrlVal(Pnl, P(BOX), " Не выполнена функция ENABLE_DAC_STREAM_PLX()!");
						SetMenuBarAttribute(B(DAC), ATTR_MENU_BAR_ENABLED, DISABLE);
						SetCtrlAttribute(Pnl, P(START), ATTR_CTRL_ENABLED, DISABLE);
						break;
					}
					DefaultCtrl(Pnl, P(BOX));
					sprintf(str,  " Осуществлен запуск ЦАП.\n Сейчас ны выходном разъеме должен наблюдаться\n следующий тип сигнала - '%s'.", SignalTypeName[SignalType]);
					SetCtrlVal(Pnl, P(BOX), str);
					break;
				}

				case P(DAC_NUMBER):
				{
					char str[100];

					GetCtrlVal(Pnl, P(DAC_NUMBER), &DAC_Number);
               sprintf(str, " Выбран ЦАП номер %1u.", DAC_Number+1);
					SetCtrlVal(Pnl, P(BOX), str);
					break;
            }

				case P(DAC_RATE):
            {
               char str[100];

					GetCtrlVal(Pnl, P(DAC_RATE), &DAC_Rate);
					SET_DAC_RATE_PLX(&bi[0], &DAC_Rate);
					SetCtrlVal(Pnl, P(DAC_RATE), DAC_Rate);
               sprintf(str, " Частота работы ЦАП установлена %.3f кГц.", DAC_Rate);
					SetCtrlVal(Pnl, P(BOX), str);

               //изменилась и частоты выдаваемого сигнала
					double FREQ=DAC_Rate/(double)DacFifoLength;
	            if(Frequency/FREQ < 0.5)
						Frequency=FREQ;
	            else
						Frequency=FREQ*(int)((Frequency/FREQ)+0.5);
					SetCtrlVal(Pnl, P(FREQUENCY), Frequency);
					break;
            }

				case P(AMPLITUDE):
            {
               char str[100];

					GetCtrlVal(Pnl, P(AMPLITUDE), &Amplitude);
					if(Amplitude > 2047) Amplitude=2047;
					else if(Amplitude < -2047) Amplitude=-2047;
					SetCtrlVal(Pnl, P(AMPLITUDE), Amplitude);
               sprintf(str, " Амплитуда сигнала равна %5i кодов ЦАП.", Amplitude);
					SetCtrlVal(Pnl, P(BOX), str);
					break;
            }

				case P(FREQUENCY):
            {
               char str[100];

					GetCtrlVal(Pnl, P(FREQUENCY), &Frequency);
	            Frequency=fabs(Frequency);
					double FREQ=DAC_Rate/(double)DacFifoLength;
					if(Frequency/FREQ < 0.5) Frequency=FREQ;
					else Frequency=FREQ*(int)((Frequency/FREQ)+0.5);
					SetCtrlVal(Pnl, P(FREQUENCY), Frequency);
               sprintf(str, " Частота выходного сигнала равна %.3f кГц.", Frequency);
					SetCtrlVal(Pnl, P(BOX), str);
					break;
            }

				case P(SIGNAL_TYPE):
            {
               char str[100];

					GetCtrlVal(Pnl, P(SIGNAL_TYPE), &SignalType);
               sprintf(str, " Тип выходного сигнала - '%s'.", SignalTypeName[SignalType]);
					SetCtrlVal(Pnl, P(BOX), str);
					break;
            }
			}
		}
   }

	UnloadPanel(Pnl);
	return EXIT;
}
示例#2
0
//---------------------------------------------------------------------------
//  панель ввода получаемых данных на диск и последующего просмотра на экране
//---------------------------------------------------------------------------
int DiskPanel(void)
{
	unsigned long j;
	int i, Key;
	int Pnl, hnd, cnt;
	int N_Blocks=100;
	static int DrawMode=0;
	static int Channel=0;
	unsigned int irq_address;
	char tip[400];
	char *UirName="demo.uir";

	// Загрузим панель
	Pnl=LoadPanel(UirName, DISK);

	ConfigureAxes(Pnl, P(GRAPH), -1, 0.0, 0.0, 0, -Diapason[Gain]/1000., Diapason[Gain]/1000.);
	SetGraphAttribute(Pnl, P(GRAPH), ATTR_GRAPH_Y_AXIS_PRECISION, 3);
	SetCtrlAttribute(Pnl, P(COUNT), ATTR_CTRL_ENABLED, DISABLE);
	SetCtrlVal(Pnl, P(DRAWMODE), DrawMode);
	SetCtrlVal(Pnl, P(CHANNEL), Channel);
	SetCtrlVal(Pnl, P(IRQ_NUMBER), bi[0].InterruptNumber);

	sprintf(tip, "В данном примере программа по клавише 'ПУСК ЗАПИСИ' запускает ввод %7lu \nточек с указанного канала АЦП в файл TEST.DAT. По нажатию на клавишу \n'ПРОСМОТР ЗАПИСИ' выводится содержимое файла TEST.DAT в виде графика.", (unsigned long)((double)BufferLenght*(double)N_Blocks));
	SetCtrlVal(Pnl, P(BOX1),tip);

	// Отобразим панель
	DisplayPanel(Pnl);

	KeyFlag=0;
	for( ; ; )
	{
		if(KeyFlag)
		{
			KeyFlag=0;
			if(KeyCode == 0x1B)
			{
				*KeybPtr1 = *KeybPtr2;
				if(ConfirmPopup("Вы желаете выйти?"))
				{
					UnloadPanel(Pnl);
					return EXIT;
				}
				KeyFlag=0;
			}
		}

		GetUserEvent(0, &hnd, &cnt);
again:
		// Выбpан пункт меню
		if(hnd==Bar)
		{
			if(cnt!=-1)
			{
				switch(cnt)
				{
					case  B(ADC):
						if(AdcParamPanel() == INPUT_PANEL)
						{
							UnloadPanel(Pnl);
							return INPUT_PANEL;
						}
						ConfigureAxes(Pnl, P(GRAPH), -1, 0.0, 0.0, 0, -Diapason[Gain]/1000., Diapason[Gain]/1000.);
						break;

					case  B(DAC):
						UnloadPanel(Pnl);
						return DAC_PANEL;

					case  B(TTL):
						UnloadPanel(Pnl);
						return TTL_PANEL;

					case  B(QUIT):
						if(ConfirmPopup("Вы желаете выйти?"))
						{
							UnloadPanel(Pnl);
							return EXIT;
						}
				}
			}
		}

		// Выбpана опция на панели
		if(hnd == Pnl)
		{
			switch(cnt)
			{
				case P(CHANNEL):
					GetCtrlVal(Pnl, P(CHANNEL), &Channel);
					DefaultCtrl(Pnl, P(BOX1));
					SetCtrlVal(Pnl, P(BOX1),tip);
					break;

				case P(DRAW):
				{
					GetCtrlVal(Pnl, P(DRAWMODE), &DrawMode);
					DeletePlots(Pnl, P(GRAPH));
					SetGraphAttribute (Pnl, P(GRAPH), ATTR_STRIP_SCROLL_MODE,
							(DrawMode) ? SCROLL_MODE_CONTINUOUS : SCROLL_MODE_BLOCK);
					DefaultCtrl(Pnl, P(BOX1));
					SetCtrlVal(Pnl, P(BOX1), "Воспроизводим данные, записанные в файле TEST.DAT");

					fp=fopen("test.dat", "rb");
					if(fp == NULL)
					{
							MessagePopup("Не могу найти файл test.dat! Нечего показывать-то!!!");
							break;
					}

					KeyFlag=0;
					while(!feof(fp) && !KeyFlag)
					{
						fread(StripData, 2, 64, fp);
						for(i=0; i < 64; i++)
							SData[i]=StripData[i]*Diapason[Gain]/(MaxAdcCode*1000.);
						PlotStripChart (Pnl, P(GRAPH), SData, 64, 0, 0, 4);
						GetUserEvent(0, &hnd, &cnt);
						if(cnt != -1) goto again;
					}
					KeyFlag=0;
					fclose(fp);
					DefaultCtrl(Pnl, P(BOX1));
					SetCtrlVal(Pnl, P(BOX1),tip);
					break;
				}

				// стаот сбоpа данных с АЦП по пpеpываниям
				case P(START):
					SetCtrlAttribute(Pnl, P(COUNT), ATTR_CTRL_ENABLED, ENABLE);
					Control_Table[0] = Channel & 0x1F;
					Control_Table[0] |= (Gain << 6);
					Control_Table[0] |= (DifOrCom << 5);
					LOAD_CONTROL_TABLE_PLX(&bi[0], 1, Control_Table);

					fp=fopen("test.dat", "wb");
					if(fp == NULL)
					{
						MessagePopup("Не могу открыть файл для записи данных!");
						break;
					}

					IrqBuffer= new int[BufferLenght];
					if(IrqBuffer == NULL)
					{
						MessagePopup("Не могу выделить память под буфер!");
						break;
					}

					DefaultCtrl(Pnl, P(BOX1));
					SetCtrlVal(Pnl, P(BOX1), "Идет ввод данных...");
					SetCtrlVal(Pnl, P(BOX1), "Для завершения ввода данных нажмите любую клавишу.");
					SetCtrlAttribute(Pnl, P(DRAW), ATTR_CTRL_ENABLED, DISABLE);

					IrqN=Half1=Half2=KeyFlag=0;
					// инициализация пpеpываний
					INIT_INTERRUPT_PLX(&bi[0], IRQ_Handler);
					// запуск pаботы АЦП
					ENABLE_IRQ_PLX(&bi[0], 1, IrqStep=1024);

					// цикл записи собpанных данных на диск
					for(i=0; i < N_Blocks; i++)
					{
						SetCtrlVal(Pnl, P(COUNT), N_Blocks-i);

						while(!Half1 && !kbhit());
						if(KeyFlag) break;
						Half1=0;
						fwrite(IrqBuffer, 2, BufferLenght/2, fp);

						while(!Half2 && !kbhit());
						if(KeyFlag) break;
						Half2=0;
						fwrite(IrqBuffer+BufferLenght/2, 2, BufferLenght/2, fp);
					}

					// останов pаботы АЦП
					ENABLE_IRQ_PLX(&bi[0], 0, 0);
					// восстановление пpеpываний
					STOP_INTERRUPT_PLX(&bi[0]);

					delete[] IrqBuffer;
					SetCtrlAttribute(Pnl, P(DRAW), ATTR_CTRL_ENABLED, ENABLE);

					DefaultCtrl(Pnl, P(BOX1));
					if(KeyFlag)
					{
						KeyFlag=0;
						SetCtrlVal(Pnl, P(BOX1), "Ввод данных злобно прерван!");
					}
					else
						SetCtrlVal(Pnl, P(BOX1), "Ввод данных удачно закончен!");
					fclose(fp);
					Control_Table[0] = 0x0;
					Control_Table[0] |= (Gain << 6);
					Control_Table[0] |= (DifOrCom << 5);
					LOAD_CONTROL_TABLE_PLX(&bi[0], CHANNEL_QUANTITY, Control_Table);
					SetCtrlAttribute(Pnl, P(COUNT), ATTR_CTRL_ENABLED, DISABLE);
					break;
			}
		}
	}
}