Go to the documentation of this file.00001 #include "input_record_repeat.h"
00002
00003 using namespace std;
00004
00005 namespace pangolin
00006 {
00007
00008 InputRecordRepeat::InputRecordRepeat(const std::string& var_record_prefix)
00009 : record(false), play(false), index(-1)
00010 {
00011 RegisterGuiVarChangedCallback(&InputRecordRepeat::GuiVarChanged,(void*)this,var_record_prefix);
00012 }
00013
00014 InputRecordRepeat::~InputRecordRepeat()
00015 {
00016
00017 }
00018
00019 void InputRecordRepeat::SetIndex(int id)
00020 {
00021
00022
00023
00024 index = id;
00025
00026 while( !play_queue.empty() && play_queue.front().index < index )
00027 {
00028
00029 FrameInput in = play_queue.front();
00030 play_queue.pop_front();
00031 Var<std::string> var(in.var);
00032 var = in.val;
00033 }
00034 }
00035
00036 void InputRecordRepeat::Record()
00037 {
00038 ClearBuffer();
00039 play = false;
00040 record = true;
00041 }
00042
00043 void InputRecordRepeat::Stop()
00044 {
00045 record = false;
00046 play = false;
00047 }
00048
00049 void InputRecordRepeat::ClearBuffer()
00050 {
00051 index = -1;
00052 record_queue.clear();
00053 play_queue.clear();
00054 }
00055
00056 ostream& operator<<(ostream& os, const FrameInput& fi )
00057 {
00058 os << fi.index << endl << fi.var << endl << fi.val << endl;
00059 return os;
00060 }
00061
00062 istream& operator>>(istream& is, FrameInput& fi)
00063 {
00064 is >> fi.index;
00065 is.ignore(std::numeric_limits<streamsize>::max(),'\n');
00066 getline(is,fi.var);
00067 getline(is,fi.val);
00068 return is;
00069 }
00070
00071 void InputRecordRepeat::SaveBuffer(const std::string& filename)
00072 {
00073 ofstream f(filename.c_str());
00074
00075 for( std::list<FrameInput>::const_iterator i = record_queue.begin(); i!=record_queue.end(); ++i )
00076 {
00077 f << *i;
00078 }
00079 }
00080
00081 void InputRecordRepeat::LoadBuffer(const std::string& filename)
00082 {
00083 record_queue.clear();
00084
00085 ifstream f(filename.c_str());
00086 while(f.good())
00087 {
00088 FrameInput fi;
00089 f >> fi;
00090 if( f.good() )
00091 record_queue.push_back(fi);
00092 }
00093 }
00094
00095 void InputRecordRepeat::PlayBuffer()
00096 {
00097 play_queue = record_queue;
00098
00099 record = false;
00100 play = true;
00101 }
00102
00103 void InputRecordRepeat::PlayBuffer(int start, int end)
00104 {
00105 std::list<FrameInput>::iterator s = record_queue.begin();
00106 std::list<FrameInput>::iterator e = record_queue.begin();
00107
00108 for(int i=0; i<start; i++) s++;
00109 for(int i=0; i<end; i++) e++;
00110
00111 play_queue.clear();
00112 play_queue.insert(play_queue.begin(),s,e);
00113
00114 record = false;
00115 play = true;
00116 }
00117
00118 int InputRecordRepeat::Size()
00119 {
00120 return record_queue.size();
00121 }
00122
00123 void InputRecordRepeat::UpdateVariable(const std::string& name )
00124 {
00125 Var<std::string> var(name);
00126
00127 if( record )
00128 {
00129 FrameInput input;
00130 input.index = index;
00131 input.var = name;
00132 input.val = var.a->Get();
00133 record_queue.push_back(input);
00134 }
00135 }
00136
00137 void InputRecordRepeat::GuiVarChanged(void* data, const std::string& name, _Var& _var)
00138 {
00139 InputRecordRepeat* thisptr = (InputRecordRepeat*)data;
00140
00141 if( thisptr->record )
00142 {
00143 Var<std::string> var(_var);
00144
00145 FrameInput input;
00146 input.index = thisptr->index;
00147 input.var = name;
00148 input.val = var.a->Get();
00149
00150 thisptr->record_queue.push_back(input);
00151 }
00152 }
00153
00154 }