sigplot.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:5k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = sigplot.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include "parmfile.h"
  7. #include "sigplot.h"
  8. #include "syst_graph.h"
  9. #ifdef _DEBUG
  10.   extern ofstream *DebugFile;
  11. #endif
  12. extern PracSimModel *CommSystem;
  13. extern ParmFile *ParmInput;
  14. extern int PassNumber;
  15. extern int EnclaveNumber;
  16. extern SystemGraph CommSystemGraph;
  17. //===============================================
  18. // constructor
  19. SignalPlotter::SignalPlotter(void)
  20. {
  21.   Plot_Sig_Id = new std::vector<GenericSignal*>;
  22. };
  23. //===============================================
  24. // destructor
  25. SignalPlotter::~SignalPlotter(void)
  26. {
  27. }
  28. //===============================================
  29. void SignalPlotter::Initialize(void)
  30. {
  31. //  int signal_num;
  32.   int num_plot_sigs;
  33.   char* instance_name;
  34.   char* sig_name;
  35.   double start_time, stop_time;
  36.   int plot_decim_rate;
  37.   bool file_header_req;
  38.   bool count_vice_time;
  39.   GenericSignal *sig_id;
  40.   num_plot_sigs = 0;
  41.   //Model_Name = COPY("SignalPlotter");
  42.   instance_name = new char[strlen("SignalPlotter")];
  43.   strcpy(instance_name, "SignalPlotter");
  44.   OPEN_PARM_BLOCK;
  45.   //GET_INT_PARM( Num_Plot_Sigs );
  46.   //avoid macro so parm will not be in reports
  47.   Num_Plot_Sigs = ParmInput->GetIntParm("Num_Plot_Sigs");
  48.   int num_reject_sigs = 0;
  49.   Wakeup_Pass = new int[Num_Plot_Sigs];
  50.   Bedtime_Pass = new int[Num_Plot_Sigs];
  51.   sig_name = new char[60];
  52.   int sig_num = -1;
  53.   if(Num_Plot_Sigs > 0)
  54.     {
  55.     // read signal name, start time, stop time
  56.     for(int sig_idx = 0; sig_idx<Num_Plot_Sigs; sig_idx++)
  57.       {
  58.       ParmInput->GetPlotSpec(  sig_name, 
  59.                               &start_time, 
  60.                               &stop_time,
  61.                               &plot_decim_rate,
  62.                               &count_vice_time,
  63.                               &file_header_req);
  64.       cout << "sig_name = " << sig_name << endl;
  65.       cout << "start_time = " << start_time << endl;
  66.       cout << "stop_time = " << stop_time << endl;
  67.       //cin >> sig_name;
  68.       //cin >> start_time;
  69.       //cin >> stop_time;
  70.       sig_id = CommSystemGraph.GetSignalId( sig_name );
  71.       if(sig_id != NULL)
  72.         {
  73.         sig_num++;
  74.         Plot_Sig_Id->push_back(sig_id);
  75.         //------------------------------------------
  76.         // check to make sure same signal is not in
  77.         // plotting list more than once
  78.         int sig_idx;
  79.         for( sig_idx = 0; sig_idx < sig_num; sig_idx++)
  80.           {
  81.           if(Plot_Sig_Id->at(sig_num) == Plot_Sig_Id->at(sig_idx))
  82.             {
  83.             // warning duplicate signal
  84.             *DebugFile << "Warning! Multiple plotting of same signal is not supported" << endl;
  85.             *DebugFile << "signal " << sig_num << " is " 
  86.                       << Plot_Sig_Id->at(sig_num)->GetName() << endl;
  87.             *DebugFile << "signal " << sig_idx << " is " 
  88.                       << Plot_Sig_Id->at(sig_idx)->GetName() << endl;
  89.             Plot_Sig_Id->at(sig_num) = NULL;
  90.             break;
  91.             }
  92.           }
  93.         if(Plot_Sig_Id->at(sig_num) != NULL)
  94.           {
  95.           Plot_Sig_Id->at(sig_num)->SetupPlotFile(
  96.                                   sig_id,
  97.                                   start_time,
  98.                                   stop_time,
  99.                                   plot_decim_rate,
  100.                                   count_vice_time,
  101.                                   file_header_req);
  102.           }
  103.         } // if(sig_id != NULL)
  104.       else
  105.         {
  106.         num_reject_sigs++;
  107.         ErrorStream << "Requested plot signal '" << sig_name
  108.                     << "' not found." << endl;
  109.         }
  110.       }//sig_idx
  111.     Num_Plot_Sigs -= num_reject_sigs;
  112.     }
  113.   return;
  114. }
  115. void SignalPlotter::SetWakeAndSleep(  GenericSignal* sig_to_plot,
  116.                                       int wakeup,
  117.                                       int bedtime)
  118. {
  119.   int plot_idx;
  120. *DebugFile << "In SignalPlotter::SetWakeAndSleep" << endl;
  121.   for(plot_idx = 0; plot_idx < Num_Plot_Sigs; plot_idx++)
  122.     {
  123.     *DebugFile << "Plot_Sig_Id->at(plot_idx) = " << Plot_Sig_Id->at(plot_idx) << endl;
  124.     *DebugFile << "sig_to_plot = " << sig_to_plot << endl;
  125.     if( Plot_Sig_Id->at(plot_idx) == sig_to_plot )
  126.       {
  127.       Wakeup_Pass[plot_idx] = wakeup;
  128.       Bedtime_Pass[plot_idx] = bedtime;
  129.       return;
  130.       }
  131.     }
  132.   *DebugFile << "Fatal error in SignalPlotter" << endl;
  133.   exit(1);
  134. }
  135. //==========================================================
  136. void SignalPlotter::CollectData(void)
  137. {
  138.   int sig_num;
  139.   GenericSignal *sig_id;
  140.   #ifdef _ENCLAVES
  141.     for( sig_num = 0; sig_num < Num_Plot_Sigs; sig_num++)
  142.       {
  143.       sig_id = Plot_Sig_Id->at(sig_num);
  144.       if(sig_id == NULL) continue;
  145.       if(PassNumber > Bedtime_Pass[sig_num]) continue;
  146.       if(PassNumber < Wakeup_Pass[sig_num]) continue;
  147.       if(EnclaveNumber != sig_id->GetEnclave()) continue;
  148.         //
  149.         // else
  150.         *DebugFile << "In Enclave " << EnclaveNumber 
  151.                   << ", issuing plot data for "
  152.                   << sig_id->GetName() << endl;
  153.         sig_id->IssuePlotterData();
  154.       }
  155.   #endif
  156.   //#ifdef _VAR_BLOCKS
  157.   //if(PassNumber ==680)
  158.   //{
  159.   //sig_num=88;
  160.   //}
  161.     for( sig_num = 0; sig_num < Num_Plot_Sigs; sig_num++)
  162.       {
  163.       sig_id = Plot_Sig_Id->at(sig_num);
  164.       if(sig_id == NULL) continue;
  165.       //if(EnclaveNumber != sig_id->GetEnclave()) continue;
  166.         //
  167.         // else
  168.         sig_id->IssuePlotterData();
  169.       }
  170.   //#endif
  171.   return;
  172. }