home *** CD-ROM | disk | FTP | other *** search
/ ftp.hitl.washington.edu / ftp.hitl.washington.edu.tar / ftp.hitl.washington.edu / pub / people / peter / ER / BP_driver.cxx next >
C/C++ Source or Header  |  1998-07-07  |  5KB  |  210 lines

  1. /*
  2.  BP_driver.cc
  3. */
  4.  
  5. #include "BP_driver.h"
  6.  
  7. #include <iostream.h>
  8. #include <vector.h>
  9. #include <math.h>
  10.  
  11. #include "v3dSystem.h"
  12.  
  13. ///////////////////////////
  14. //    BPDriver    //
  15. /////////////////////////
  16.  
  17. //const double BPDriver::ms_Interval = 25.0;    // 25 ms per interval
  18. const double BPDriver::ms_Interval = 40.0;    // 40 ms per interval
  19.  
  20. vector <vector <BP_DATA_TYPE> >    test_BP_values;
  21.  
  22. template<class T>
  23. vector<T> to_vec (int num_values, T *data_ary)
  24. {
  25.         vector<T> new_vec;
  26.         for (int i = 0; i < num_values; ++i)
  27.                 new_vec.push_back (data_ary[i]);
  28.         return new_vec;
  29. }
  30.  
  31. #include <stdio.h>
  32.  
  33. bool
  34. BPDriver::read_data (char *filename)
  35. {
  36.     FILE *fp = fopen(filename, "r");
  37.     if (fp == NULL) {
  38.         cerr << "BPDriver::read_data: Error opening file: " <<
  39.             filename << endl;
  40.         return false;
  41.     }
  42.  
  43.     BP_DATA_TYPE    alt;
  44.  
  45.     vector<BP_DATA_TYPE> alt_vec;
  46.  
  47.     while (!feof(fp)) {
  48.         fscanf (fp, "%f", &alt);
  49.         if (feof(fp))
  50.             break;
  51.         alt_vec.push_back(alt);
  52.     }
  53.  
  54.     test_BP_values.push_back(alt_vec);
  55.  
  56.     fclose (fp);
  57.  
  58.     return true;
  59. }
  60.  
  61. BPDriver::BPDriver(char* data_filename)
  62. {
  63.     read_data (data_filename);
  64.  
  65.     data_list = 0;
  66.  
  67.     switch_data (0);
  68.  
  69.     // Register this object's event handler with the system loop.
  70.     // This is for demo purposes only.
  71.     RegisterEventHandler(v3dSystem::GetInstance(),
  72.         v3dSystem::SYSTEM_SIMULATION_LOOP, &BP_update_callback, 0);
  73.  
  74.     paused_ = false;
  75. }
  76.  
  77. BPDriver::~BPDriver()
  78. {
  79.     delete data_list;
  80. }
  81.  
  82. void
  83. BPDriver::Pause()
  84. {
  85.     if (!paused_) {
  86.         // Unregister this object's event handler with the system loop.
  87.         // This is for demo purposes only.
  88. //        UnregisterEventHandler(v3dSystem::GetInstance(),
  89. //            v3dSystem::SYSTEM_SIMULATION_LOOP, &BP_update_callback);
  90.         paused_ = true;
  91.     }
  92. }
  93.  
  94. void
  95. BPDriver::Unpause()
  96. {
  97.     if (paused_) {
  98.         // Re-register this object's event handler with the system loop.
  99.         // This is for demo purposes only.
  100. //        RegisterEventHandler(v3dSystem::GetInstance(),
  101. //            v3dSystem::SYSTEM_SIMULATION_LOOP, &BP_update_callback, 0);
  102.         paused_ = false;
  103.     }
  104. }
  105.  
  106. BP_DATA_RANGE
  107. BPDriver::switch_data (int set_no)
  108. {
  109.     // A negative set number parameter increments the current set number.
  110.     if (set_no < 0) 
  111.         ++current_set_;
  112.     else
  113.         current_set_ = set_no;
  114.  
  115.     // Choose set 0 if the specified set is out of range.
  116.     if (current_set_ >= test_BP_values.size())
  117.         current_set_ = 0;
  118.  
  119.     int    set_size = test_BP_values[current_set_].size(),
  120.         num_cycles = 100 / set_size + 1;
  121.     max_index_ = set_size * num_cycles;
  122. cerr << "Set size: " << set_size << " Number of cycles: " << num_cycles <<
  123.     " Max index: " << max_index_ << endl;
  124.  
  125.     // Allocate a new array to hold the data values, and copy them from
  126.     // the vector of values.
  127.     delete [] data_list;
  128.  
  129.     data_list = new BP_DATA_TYPE [max_index_];
  130.  
  131.     for (int j = 0; j < max_index_; ++j)
  132.         data_list[j] = test_BP_values[current_set_][j % set_size];
  133.  
  134.     // Set the index to the start of the data.
  135.     reset_current_index();
  136.  
  137.     // Get the ranges of the data.
  138.     data_range_.maximum_value = data_list[0];
  139.     data_range_.minimum_value = data_list[0];
  140.     for (int i = 1; i < set_size; ++i) {
  141.         if (data_list[i] > data_range_.maximum_value)
  142.             data_range_.maximum_value = data_list[i];
  143.         if (data_list[i] < data_range_.minimum_value)
  144.             data_range_.minimum_value = data_list[i];
  145.     }
  146.  
  147.     return data_range_;
  148. }
  149.  
  150. void
  151. BPDriver::BP_update_callback(const v3dEventMessage *message)
  152. {
  153.     ((BPDriver *)message->GetEventReceiver())->update_current_index();
  154. }
  155.  
  156. // usec_diff
  157. //    Calculate the difference in microseconds between the two times
  158. //    passed in.
  159. inline float
  160. usec_diff (const timeval& current_time, const timeval& past_time)
  161. {
  162.     return (current_time.tv_sec - past_time.tv_sec) * 1000000 +
  163.         current_time.tv_usec - past_time.tv_usec;
  164. }
  165.  
  166. // BPDriver::update_current_index
  167. //    Changes the current index to the BP data depending on how much
  168. //    time has elapsed since the last update.
  169. //    Each value in the array represents a piece of BP data read at
  170. //    40ms intervals.
  171. int
  172. BPDriver::update_current_index ()
  173. {
  174.     if (IsPaused()) return current_data_;
  175.  
  176.     timeval current_time;
  177.  
  178. //cerr << "clock / sec: " << CLOCKS_PER_SEC;
  179.     gettimeofday (¤t_time);
  180. //cerr << " elapsed clock: " << current_time.tv_usec - last_time_.tv_usec;
  181. //cerr << " elapsed int: " << ((current_time.tv_sec - last_time_.tv_sec) *
  182. //        1000000 + current_time.tv_usec - last_time_.tv_usec)
  183. //         / (1000 * ms_Interval);
  184. //cerr << endl;
  185.  
  186. //    true_index_ += ((current_time.tv_sec - last_time_.tv_sec) * 1000000 +
  187. //        current_time.tv_usec - last_time_.tv_usec) /
  188. //        (1000 * ms_Interval);
  189.     true_index_ += usec_diff (current_time, last_time_) /
  190.         (1000 * ms_Interval);
  191.     while (true_index_ >= max_index_)
  192.         true_index_ -= max_index_;
  193.     current_data_ = (int) ffloor (true_index_);
  194.     last_time_ = current_time;
  195.  
  196. //cerr << " true index: " << true_index_;
  197. //cerr << " current index: " << current_data_ << endl;
  198.     return current_data_;
  199. }
  200.  
  201. int
  202. BPDriver::reset_current_index ()
  203. {
  204. //    last_time_ = clock();
  205.     gettimeofday(&last_time_);
  206.     true_index_ = 0;
  207.     return current_data_ = 0;
  208. }
  209.  
  210.