Создание редактора входных воздействий цифровых сигналов для САПР OrCad 9.1, страница 4

          TShiftState Shift);

        void __fastcall FormKeyUp(TObject *Sender, WORD &Key,

          TShiftState Shift);

        void __fastcall FormActivate(TObject *Sender);

        void __fastcall SaveAsMnuClick(TObject *Sender);

        void __fastcall SigPropClick(TObject *Sender);

        void __fastcall SaveBtnClick(TObject *Sender);

private:   // User declarations

public:           // User declarations

        void __fastcall LoadFromFile(char *fname);

        void __fastcall AddSignal(int type);

        void __fastcall ChangeBusVal(char *val,int ff);

        __fastcall TStmForm(TComponent* Owner);

};

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

#define N 100 //макс. кол-во перключений у сигнала

#define M 5   //макс. длина в символах значения сигнала

#define NUM_SIGNALS 10 //макс. кол-во сигналов

#define NUM_LINES 10

#define OFFS_X    0

#define OTSTUP 100

#define Y_STEP 80

#define RAZBROS 30

class signal{

  private:

    int num_ff;     //количество переключений сигнала

    int times[N];   //время переключения сигнала

    char v[N][M];   //значене сигнала

    int dim;        //разрядность сигнала

    char name[100]; //имя сигнала

  public:

    void SetSignalInfo(int _ff, int _dim,char *_name);  //Установка информ. о сигнале

    void SetOneFF(int index,int _time, char *val); //Уст. инф. об одном переключении

    void InsertFF(int _time, char *val);  //вставить переключение

    char *GetValAtTime(int _time); //вернуть значение по времени

    int FindNearest(int _time);//ищет индекс ближайшего переключения

    int GetFFAtTime(int _time); //Возвращает номер переключения

    void delFF(int index);//удаляет переключение по индексу

    int GetDimension(); //Считать разрядность сигнала

    int GetNumFF();     //Считать кол-во переключений сигнала

    char *GetName();    //Считать имя сигнала

    void GetOneFF(int index, int *_time, char *val);  //Считать информацию о переключении

    void Save(FILE *f); //сохранть сигнал

    signal();  //конструктор

} signals[NUM_SIGNALS];

int num_signals=0;

int r_res_x=2000;

int offset=0;

int sig_offset=0;

int cur_sig=0; //текущий сигнал

int ctrl_down=0;

int schname_len=0; //длина строки имени схемы

int CUR_X=0;

int opened=0;  //открыт ли файл

char schname[100];

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

extern PACKAGE TStmForm *StmForm;

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

#endif

Main.cpp

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

#include <vcl.h>

#pragma hdrstop

#include "main.h"

#include "newsig.h"

#include "about.h"

#include "newbasic.h"

#include "newbus.h"

#include "newclock.h"

#include "prop.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TStmForm *StmForm;

//---

int GetSchLen(FILE *f)

{

  char v;

  fseek(f,12l,SEEK_SET);

  fread(&v,sizeof(char),1,f);

  return v;

}

void read_signal_info(FILE *f)

{

  char v,c=100,schname[50],signame[50],len,ff/*flip-flop*/,type,vv,siglen,_tmp[100];

  char value[10];

  long pos=0,pos2=0;

  unsigned long tp=0,val=0;

  int i;

  int signal_counter=-1;

  unsigned long start_p,p_one,p_two;

  char one_v[3],two_v[3];

  schname_len=GetSchLen(f);

  fseek(f,12l,SEEK_SET);

  while(!feof(f))

  {

  fread(&v,sizeof(char),1,f);

  if (feof(f)) return;

  if (v==schname_len)

  {

    fread(schname,schname_len,1,f);

          schname[schname_len]=0;

    fread(&len,sizeof(char),1,f);

    fread(signame,len,1,f);

    signame[len]=0;

    fread(&ff,sizeof(char),1,f);

    fseek(f,4,SEEK_CUR);

    fread(&type,sizeof(char),1,f);

          signal_counter+=1;

          strcpy(_tmp,schname);

          strcat(_tmp,".");

          strcat(_tmp,signame);

          signals[signal_counter].SetSignalInfo(ff,1,_tmp);

    switch(type)

    {

                  //clock signal

           case 0x24:

                       fseek(f,1,SEEK_CUR);

                       fread(&start_p,sizeof(unsigned long),1,f);

                       fseek(f,4,SEEK_CUR);

                       fread(&p_one,sizeof(unsigned long),1,f);

                       fseek(f,4,SEEK_CUR);

                       fread(&p_two,sizeof(unsigned long),1,f);

                       fseek(f,9,SEEK_CUR);

                       if (feof(f))

                         fseek(f,-3,SEEK_CUR);

                       else

                         fseek(f,-4,SEEK_CUR);

                       for(i=0;c!=0x1;i++)

                       {

                        fread(&c,1,1,f);

                        one_v[i]=c;

                       }

                   one_v[i-1]=0;

                   for(i=0;c!=schname_len&&!feof(f);i++)

                   {

                        fread(&c,1,1,f);

                        two_v[i]=c;

                   }

                   two_v[i-1]=0;

                   fseek(f,-1,SEEK_CUR);

                           signals[signal_counter].SetOneFF(0,p_one,one_v);

                           signals[signal_counter].SetOneFF(1,p_two,two_v);

                           signals[signal_counter].SetSignalInfo(2,3,_tmp);

                  break;

           case 0x21:

                                int ff_counter=-1;

                       for (int i=0;i<ff&&!feof(f);i++){

                             fseek(f,1,SEEK_CUR);

                             fread(&tp,sizeof(long),1,f);

                             fread(&val,sizeof(long),1,f);

                             switch (tp)

                             {

                               case 0x2:vv='0';

                                       break;

                               case 0x3:vv='1';

                                       break;

                               case 0x4:vv='Z';

                                       break;

                               case 0xFFFFFFFF:vv='B';

                                                          signals[signal_counter].SetSignalInfo(ff,2,_tmp);