Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef NAMEDDESCRIPTOR_H
00026 #define NAMEDDESCRIPTOR_H
00027
00028 #include <string>
00029 #include <ros/ros.h>
00030 #include <sstream>
00031 #include <Descriptor.h>
00032
00033
00034 namespace cop
00035 {
00036
00037 template <class Content> class NamedDescriptor: public Descriptor
00038 {
00039 public:
00040 NamedDescriptor(const char* Name, const char* ClassName, const ElemType_t DescriptorType) :
00041 m_stXMLName(Name),
00042 m_stClassName(ClassName),
00043 m_elemType(DescriptorType)
00044 {
00045 m_class = new Class();
00046 m_class->SetName(m_stClassName);
00047 }
00048 std::string BuildFileName(){
00049 std::ostringstream os;
00050 os << GetNodeName().c_str() << "_" <<m_ID << ".msg";
00051 std::string filename = os.str();
00052 return filename;
00053 }
00054 void SetClass(std::string name)
00055 {
00056 delete m_class;
00057 m_stClassName = name;
00058 m_class = new Class();
00059 m_class->SetName(m_stClassName);
00060 }
00061 std::string GetNodeName() const{return m_stXMLName;}
00062 ElemType_t GetType() const {return m_elemType;}
00063
00064 virtual void ContentToFileFunction(std::string filename)
00065 {
00066 uint32_t length = m_content.serializationLength();
00067 uint8_t* write_pointer = new uint8_t[length];
00068 uint8_t seq = 0, *outp;
00069 outp = m_content.serialize(write_pointer, seq);
00070 FILE* file = fopen(filename.c_str(), "w");
00071 if(file != NULL)
00072 {
00073 fwrite(write_pointer, 1, length, file);
00074 fclose(file);
00075 }
00076 else
00077 {
00078 ROS_ERROR("Could not write message to file (filename: %s in Class %s)\n", filename.c_str(), GetNodeName().c_str());
00079 }
00080 delete write_pointer;
00081 };
00082 virtual void FileToContentFunction(std::string filename)
00083 {
00084 if(filename.length() > 0)
00085 {
00086 FILE* file = fopen(filename.c_str(), "r");
00087 if (file==NULL)
00088 {
00089 ROS_ERROR("Could not read message from file (filename: %s in Class %s)\n", filename.c_str(), GetNodeName().c_str());
00090 throw("Error reading class");
00091 }
00092
00093
00094 fseek (file, 0 , SEEK_END);
00095 long lSize = ftell (file);
00096 rewind (file);
00097 uint8_t* buffer = new uint8_t[lSize];
00098 if (buffer == NULL)
00099 {
00100 ROS_ERROR("Could not read message from file (filename: %s in Class %s)\n", filename.c_str(), GetNodeName().c_str());
00101 throw("Error reading class");
00102 }
00103
00104
00105 long result = fread (buffer,1,lSize,file);
00106 if (result != lSize)
00107 {
00108 ROS_ERROR("Could not read message from file (filename: %s in Class %s)\n", filename.c_str(), GetNodeName().c_str());
00109 delete buffer;
00110 throw("Error reading class");
00111 }
00112 m_content.deserialize(buffer);
00113 fclose (file);
00114 delete buffer;
00115 }
00116 }
00117 void SetContent(Content cont){m_content = cont;};
00118 Content GetContent() { return m_content;}
00119 std::string m_stXMLName;
00120 std::string m_stClassName;
00121 ElemType_t m_elemType;
00122 Content m_content;
00123 };
00124
00125 #define CREATE_NAMED_DESCRIPTOR(DescriptorName, XMLDescriptorName, ClassName, DescriptorType, Content) \
00126 class DescriptorName : public NamedDescriptor<Content> \
00127 { \
00128 public: \
00129 DescriptorName() : NamedDescriptor<Content>(XMLDescriptorName, ClassName, DescriptorType){} \
00130 void SaveTo(XMLTag* tag) \
00131 { \
00132 Descriptor::SaveTo(tag); \
00133 try \
00134 { \
00135 std::string filename = BuildFileName(); \
00136 printf("Trying to save to %s\n", filename.c_str()); \
00137 tag->AddProperty(XML_ATTRIBUTE_FILENAME, filename); \
00138 ContentToFileFunction(filename); \
00139 } \
00140 catch(...) \
00141 { \
00142 ROS_ERROR("%s:Failed to save data\n", GetNodeName().c_str()); \
00143 } \
00144 } \
00145 protected: \
00146 void SetData(XMLTag* tag) \
00147 { \
00148 Descriptor::SetData(tag); \
00149 FileToContentFunction(tag->GetProperty(XML_ATTRIBUTE_FILENAME)); \
00150 } \
00151 }; \
00152
00153 #define CREATE_NAMED_DESCRIPTOR_SHOW(DescriptorName, XMLDescriptorName, ClassName, DescriptorType, Content) \
00154 class DescriptorName : public NamedDescriptor<Content> \
00155 { \
00156 public: \
00157 DescriptorName() : NamedDescriptor<Content>(XMLDescriptorName, ClassName, DescriptorType){} \
00158 void SaveTo(XMLTag* tag) \
00159 { \
00160 Descriptor::SaveTo(tag); \
00161 try \
00162 { \
00163 std::string filename = BuildFileName(); \
00164 printf("Trying to save to %s\n", filename.c_str()); \
00165 tag->AddProperty(XML_ATTRIBUTE_FILENAME, filename); \
00166 ContentToFileFunction(filename); \
00167 } \
00168 catch(...) \
00169 { \
00170 ROS_ERROR("%s:Failed to save data\n", GetNodeName().c_str()); \
00171 } \
00172 } \
00173 void Show(RelPose* pose, Sensor* sens); \
00174 protected: \
00175 void SetData(XMLTag* tag) \
00176 { \
00177 Descriptor::SetData(tag); \
00178 FileToContentFunction(tag->GetProperty(XML_ATTRIBUTE_FILENAME)); \
00179 } \
00180 }; \
00181
00182 }
00183 #endif // NAMEDDESCRIPTOR_H
00184