root/juggler/branches/2.2/modules/gadgeteer/gadget/Type/Digital.cpp

Revision 19729, 6.4 kB (checked in by patrick, 2 years ago)

Copyright update.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /*************** <auto-copyright.pl BEGIN do not edit this line> **************
2  *
3  * VR Juggler is (C) Copyright 1998-2007 by Iowa State University
4  *
5  * Original Authors:
6  *   Allen Bierbaum, Christopher Just,
7  *   Patrick Hartling, Kevin Meinert,
8  *   Carolina Cruz-Neira, Albert Baker
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public
21  * License along with this library; if not, write to the
22  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 02111-1307, USA.
24  *
25  *************** <auto-copyright.pl END do not edit this line> ***************/
26
27 #include <gadget/gadgetConfig.h>
28
29 #include <boost/concept_check.hpp>
30
31 #include <vpr/Util/Debug.h>
32 #include <vpr/IO/ObjectWriter.h>
33 #include <vpr/IO/ObjectReader.h>
34 #include <gadget/Util/DeviceSerializationTokens.h>
35
36 #include <gadget/Type/Digital.h>
37
38
39 namespace gadget
40 {
41
42 const DigitalData Digital::getDigitalData(int devNum)
43 {
44    SampleBuffer_t::buffer_t& stable_buffer = mDigitalSamples.stableBuffer();
45
46    if ( (!stable_buffer.empty()) &&
47         (stable_buffer.back().size() > (unsigned)devNum) )  // If Have entry && devNum in range
48    {
49       return stable_buffer.back()[devNum];
50    }
51    else        // No data or request out of range, return default value
52    {
53       if ( stable_buffer.empty() )
54       {
55          vprDEBUG(vprDBG_ALL, vprDBG_WARNING_LVL)
56             << "WARNING: [gadget::Digital::getDigitalData()] "
57             << "Stable buffer is empty.  If this is not the first "
58             << "read, then this is a problem.\n" << vprDEBUG_FLUSH;
59       }
60       else
61       {
62          vprDEBUG(vprDBG_ALL, vprDBG_CONFIG_LVL)
63             << "WARNING: [gadget::Digital::getDigitalData()] "
64             << "Requested devNum (" << devNum
65             << ") is not in the range available.  "
66             << "This is probably a configuration error.\n"
67             << vprDEBUG_FLUSH;
68       }
69       return mDefaultValue;
70    }
71 }
72
73 void Digital::writeObject(vpr::ObjectWriter* writer)
74 {
75    writer->beginTag(Digital::getInputTypeName());
76    //std::cout << "[Remote Input Manager] In Digital write" << std::endl;
77    SampleBuffer_t::buffer_t& stable_buffer = mDigitalSamples.stableBuffer();
78    writer->beginAttribute(gadget::tokens::DataTypeAttrib);
79       writer->writeUint16(MSG_DATA_DIGITAL);                               // Write out the data type so that we can assert if reading in wrong place
80    writer->endAttribute();
81
82    writer->beginAttribute(gadget::tokens::SampleBufferLenAttrib);
83       writer->writeUint16(stable_buffer.size());                           // Write the # of vectors in the stable buffer
84    writer->endAttribute();
85
86    if ( !stable_buffer.empty() )
87    {
88       mDigitalSamples.lock();
89       for ( unsigned j=0;j<stable_buffer.size();j++ )                               // For each vector in the stable buffer
90       {
91          writer->beginTag(gadget::tokens::BufferSampleTag);
92          writer->beginAttribute(gadget::tokens::BufferSampleLenAttrib);
93             writer->writeUint16(stable_buffer[j].size());                           // Write the # of DigitalDatas in the vector
94          writer->endAttribute();
95          for ( unsigned i=0;i<stable_buffer[j].size();i++ )                         // For each DigitalData in the vector
96          {
97             writer->beginTag(gadget::tokens::DigitalValue);
98             writer->beginAttribute(gadget::tokens::TimeStamp);
99                writer->writeUint64(stable_buffer[j][i].getTime().usec());           // Write Time Stamp vpr::Uint64
100             writer->endAttribute();
101             writer->writeUint32((vpr::Uint32)stable_buffer[j][i].getDigital());  // Write Digital Data(int)
102             writer->endTag();
103          }
104          writer->endTag();
105       }
106       mDigitalSamples.unlock();
107    }
108    writer->endTag();
109 }
110
111 void Digital::readObject(vpr::ObjectReader* reader)
112 {
113       //std::cout << "[Remote Input Manager] In Digital read" << std::endl;
114    vprASSERT(reader->attribExists("rim.timestamp.delta"));
115    vpr::Uint64 delta = reader->getAttrib<vpr::Uint64>("rim.timestamp.delta");
116
117       // ASSERT if this data is really not Digital Data
118    reader->beginTag(Digital::getInputTypeName());
119    reader->beginAttribute(gadget::tokens::DataTypeAttrib);
120       vpr::Uint16 temp = reader->readUint16();
121    reader->endAttribute();
122
123    // XXX: Should there be error checking for the case when vprASSERT()
124    // is compiled out?  -PH 8/21/2003
125    vprASSERT(temp==MSG_DATA_DIGITAL && "[Remote Input Manager]Not Digital Data");
126    boost::ignore_unused_variable_warning(temp);
127
128    std::vector<DigitalData> dataSample;
129
130    unsigned numDigitalDatas;
131    vpr::Uint32 value;
132    vpr::Uint64 timeStamp;
133    DigitalData temp_digital_data;
134
135    reader->beginAttribute(gadget::tokens::SampleBufferLenAttrib);
136       unsigned numVectors = reader->readUint16();
137    reader->endAttribute();
138
139    //std::cout << "Stable Digital Buffer Size: "  << numVectors << std::endl;
140    mDigitalSamples.lock();
141    for ( unsigned i=0;i<numVectors;i++ )
142    {
143       reader->beginTag(gadget::tokens::BufferSampleTag);
144       reader->beginAttribute(gadget::tokens::BufferSampleLenAttrib);
145          numDigitalDatas = reader->readUint16();
146       reader->endAttribute();
147
148       dataSample.clear();
149       for ( unsigned j=0;j<numDigitalDatas;j++ )
150       {
151          reader->beginTag(gadget::tokens::DigitalValue);
152          reader->beginAttribute(gadget::tokens::TimeStamp);
153             timeStamp = reader->readUint64();    // read Time Stamp vpr::Uint64
154          reader->endAttribute();
155          value = reader->readUint32();           // read Digital Data(int)
156          reader->endTag();
157
158          temp_digital_data.setDigital(value);
159          temp_digital_data.setTime(vpr::Interval(timeStamp + delta,vpr::Interval::Usec));
160          dataSample.push_back(temp_digital_data);
161       }
162       mDigitalSamples.addSample(dataSample);
163       reader->endTag();
164    }
165    mDigitalSamples.unlock();
166    mDigitalSamples.swapBuffers();
167
168    reader->endTag();
169 }
170
171 } // End of gadget namespace
172
Note: See TracBrowser for help on using the browser.