sigplot.cpp

来自「《无线通信系统仿真——c++使用模型》这本书的源代码」· C++ 代码 · 共 184 行

CPP
184
字号
//
//  File = sigplot.cpp
//

#include <stdlib.h>
#include <fstream>
#include "parmfile.h"
#include "sigplot.h"
#include "syst_graph.h"
#ifdef _DEBUG
  extern ofstream *DebugFile;
#endif
extern PracSimModel *CommSystem;
extern ParmFile *ParmInput;
extern int PassNumber;
extern int EnclaveNumber;
extern SystemGraph CommSystemGraph;


//===============================================
// constructor
SignalPlotter::SignalPlotter(void)
{
  Plot_Sig_Id = new std::vector<GenericSignal*>;
};
//===============================================
// destructor
SignalPlotter::~SignalPlotter(void)
{
}
//===============================================
void SignalPlotter::Initialize(void)
{
//  int signal_num;
  int num_plot_sigs;
  char* instance_name;
  char* sig_name;
  double start_time, stop_time;
  int plot_decim_rate;
  bool file_header_req;
  bool count_vice_time;
  GenericSignal *sig_id;
  num_plot_sigs = 0;

  //Model_Name = COPY("SignalPlotter");
  instance_name = new char[strlen("SignalPlotter\0")];
  strcpy(instance_name, "SignalPlotter\0");


  OPEN_PARM_BLOCK;
  //GET_INT_PARM( Num_Plot_Sigs );
  //avoid macro so parm will not be in reports
  Num_Plot_Sigs = ParmInput->GetIntParm("Num_Plot_Sigs\0");
  int num_reject_sigs = 0;

  Wakeup_Pass = new int[Num_Plot_Sigs];
  Bedtime_Pass = new int[Num_Plot_Sigs];

  sig_name = new char[60];
  int sig_num = -1;
  if(Num_Plot_Sigs > 0)
    {
    // read signal name, start time, stop time
    for(int sig_idx = 0; sig_idx<Num_Plot_Sigs; sig_idx++)
      {
      ParmInput->GetPlotSpec(  sig_name, 
                              &start_time, 
                              &stop_time,
                              &plot_decim_rate,
                              &count_vice_time,
                              &file_header_req);
      cout << "sig_name = " << sig_name << endl;
      cout << "start_time = " << start_time << endl;
      cout << "stop_time = " << stop_time << endl;
      //cin >> sig_name;
      //cin >> start_time;
      //cin >> stop_time;
      sig_id = CommSystemGraph.GetSignalId( sig_name );
      if(sig_id != NULL)
        {
        sig_num++;
        Plot_Sig_Id->push_back(sig_id);

        //------------------------------------------
        // check to make sure same signal is not in
        // plotting list more than once
        int sig_idx;
        for( sig_idx = 0; sig_idx < sig_num; sig_idx++)
          {
          if(Plot_Sig_Id->at(sig_num) == Plot_Sig_Id->at(sig_idx))
            {
            // warning duplicate signal
            *DebugFile << "Warning! Multiple plotting of same signal is not supported" << endl;
            *DebugFile << "signal " << sig_num << " is " 
                      << Plot_Sig_Id->at(sig_num)->GetName() << endl;
            *DebugFile << "signal " << sig_idx << " is " 
                      << Plot_Sig_Id->at(sig_idx)->GetName() << endl;
            Plot_Sig_Id->at(sig_num) = NULL;
            break;
            }
          }
        if(Plot_Sig_Id->at(sig_num) != NULL)
          {
          Plot_Sig_Id->at(sig_num)->SetupPlotFile(
                                  sig_id,
                                  start_time,
                                  stop_time,
                                  plot_decim_rate,
                                  count_vice_time,
                                  file_header_req);
          }
        } // if(sig_id != NULL)
      else
        {
        num_reject_sigs++;
        ErrorStream << "Requested plot signal '" << sig_name
                    << "' not found." << endl;
        }
      }//sig_idx
    Num_Plot_Sigs -= num_reject_sigs;
    }
  return;
}

void SignalPlotter::SetWakeAndSleep(  GenericSignal* sig_to_plot,
                                      int wakeup,
                                      int bedtime)
{
  int plot_idx;
*DebugFile << "In SignalPlotter::SetWakeAndSleep" << endl;
  for(plot_idx = 0; plot_idx < Num_Plot_Sigs; plot_idx++)
    {
    *DebugFile << "Plot_Sig_Id->at(plot_idx) = " << Plot_Sig_Id->at(plot_idx) << endl;
    *DebugFile << "sig_to_plot = " << sig_to_plot << endl;
    if( Plot_Sig_Id->at(plot_idx) == sig_to_plot )
      {
      Wakeup_Pass[plot_idx] = wakeup;
      Bedtime_Pass[plot_idx] = bedtime;
      return;
      }
    }
  *DebugFile << "Fatal error in SignalPlotter" << endl;
  exit(1);
}
//==========================================================
void SignalPlotter::CollectData(void)
{
  int sig_num;
  GenericSignal *sig_id;

  #ifdef _ENCLAVES
    for( sig_num = 0; sig_num < Num_Plot_Sigs; sig_num++)
      {
      sig_id = Plot_Sig_Id->at(sig_num);
      if(sig_id == NULL) continue;
      if(PassNumber > Bedtime_Pass[sig_num]) continue;
      if(PassNumber < Wakeup_Pass[sig_num]) continue;
      if(EnclaveNumber != sig_id->GetEnclave()) continue;
        //
        // else
        *DebugFile << "In Enclave " << EnclaveNumber 
                  << ", issuing plot data for "
                  << sig_id->GetName() << endl;
        sig_id->IssuePlotterData();
      }
  #endif
  //#ifdef _VAR_BLOCKS
  //if(PassNumber ==680)
  //{
  //sig_num=88;
  //}
    for( sig_num = 0; sig_num < Num_Plot_Sigs; sig_num++)
      {
      sig_id = Plot_Sig_Id->at(sig_num);
      if(sig_id == NULL) continue;
      //if(EnclaveNumber != sig_id->GetEnclave()) continue;
        //
        // else
        sig_id->IssuePlotterData();
      }
  //#endif
  return;
}

⌨️ 快捷键说明

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