Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Эмулятор L-1250?

Вы не вошли.

 Поиск | Регистрация | Вход 

SAA
12.05.2000 14:03:53
#1

Гость

Эмулятор L-1250?

Пишется программа на Delphi 5 для L-1250, которая использует LCARD_32.DLL. Т.к. в распоряжении пока нет физически этой платы, то хочется написать эмулятор, который бы дурил на уровне портов I/O основную программу (набор действий очень ограничен, вывод на цифровые выходы+ввод с одного канала). Возможно ли такое? Если да, то как лучше всего это организовать под Win9x? Приветствуется любая информация. Большая просьба продублировать на E-mail.

Vale
12.05.2000 17:49:30
#2

Гость

Re: Эмулятор L-1250?

Гхм... Организуешь буфер с "подложными" данными...
периодически смотришь на таймер и передвигаешь указатель ввода. Этот указатель обеспечивается классом, который инкапсулирует интерфейс с платой.

В принципе у меня такое написано для одноканального ввода-вывода по DMA для С++


Заголовок:

class tLCard
    {
    public:
    tLCard();
    ~tLCard();
    long AllocateBuffers(short nInputChannels,short * nInputArr, int nOutput,
                                 long RateMks,long SamplesWanted);
   StartDMA();
    void    StopDMA();

   protected:
    static CardState State;
    int Emulation;
   int NumberOfInputChannels;
   int BufferCapacityInFrames;
    int FAR * InputChannelArray;
    long InputOutputRateMks;
   short FAR * DiskBuffer;
    static short FAR * DMA_OUT_BUFFER;
    static short FAR * DMA_IN_BUFFER;
   int HalfWritten;
   FILE * RAWDATA;

   public:
   const short FAR * OutBuffer(){return DMA_OUT_BUFFER; };
   const short FAR * InBuffer(){return DMA_IN_BUFFER; };
   short InputPointer();
   short InputBufferCapacity(){return BufferCapacityInFrames;};
   int Flush();
   int StartWriting( char * RawDataFName="linedata.$$$");
   int PauseWriting();
   int ResumeWriting();
   int EndWriting();
    };
char *Diagnostics();

//---------------------------

static clock_t LastClocksRequest=-1;
short tLCard::InputPointer()
   {
   if (State!=Working) return -32768;
   if (Emulation) // Very simple method, you know...
       {
      int z=rand()/20;
        clock_t CurrentClocks=clock();
        if (CurrentClocks==-1) return -32768;
        long FramesToAdd=(CurrentClocks-LastClocksRequest)/(InputOutputRateMks*CLK_TCK);
        FramesToAdd/=1000000L;
      LastClocksRequest=CurrentClocks;
       for (int j=0;j<FramesToAdd;j++)
           {
         EmulationPointer++;
          EmulationPointer%=BufferCapacityInFrames;
            for (int k=0;k<NumberOfInputChannels;k++)
            DMA_IN_BUFFER[EmulationPointer*NumberOfInputChannels+k]=z;
         };
      return EmulationPointer;
      };
   return BufferCapacityInFrames-(DMA_COUNTER()/NumberOfInputChannels);
   };

SAA
13.05.2000 09:16:05
#3

Гость

Re: Эмулятор L-1250?

к сожалению я слаб в СИ sad если бы кто это в паскале показал...

Vale
13.05.2000 14:33:51
#4

Гость

Re: Эмулятор L-1250?

Ну, ничем большим помочь не могу...
В принципе, все сказано в коде; идея надеюсь ясна.

Чтобы было легче - замени { на begin, } на end;
= на :=; a == на = .
Получишь почти Паскаль...
Спроси своих спецов - может кто-то переведет на Паскаль.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск