//--------------------------------------------------------- // работа с ЦАП //--------------------------------------------------------- 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; }
//--------------------------------------------------------------------------- // панель ввода получаемых данных на диск и последующего просмотра на экране //--------------------------------------------------------------------------- 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; } } } }