Refacor whole structure
[opengigevision:opengigevision.git] / GenICam.cpp
1 #include <cstdlib>
2 #include <exception>
3 #include <sstream>
4 #include <iostream>
5 #include <fstream>
6 #include <functional>
7 #include <boost/format.hpp>
8 #include <boost/algorithm/string.hpp>
9 #include <boost/filesystem/operations.hpp>
10 #include <boost/bind.hpp>
11 #include <boost/lambda/lambda.hpp>
12 #include <zip.h>
13
14 #include "GigEVision.h"
15 #include "Gvcp.h"
16 #include "GenICam.h"
17
18 GenICamManager::GenICamManager(GigEVision& gev):
19       m_gev(gev)
20 {
21
22 }
23
24 void GenICamManager::ReadXmlFile()
25 {
26   std::vector<uint8_t> data = m_gev.Gvcp().ReadBlock(GENICAM_ZIPFILEINFO_ADDRESS, 512);
27   std::string sTxt(data.begin(), data.end());
28
29   std::vector<std::string> aParts;
30   boost::algorithm::split(aParts, sTxt, boost::algorithm::is_any_of(";"));
31
32   if(aParts.size() != 3)
33     throw std::runtime_error("Error getting genicam file location on camera");
34
35   int nAddr, nSize;
36   std::stringstream ss;
37   ss << std::hex << aParts[1];
38   ss >> nAddr;
39   ss.clear();
40   ss << std::hex << aParts[2];
41   ss >> nSize;
42
43   data = m_gev.Gvcp().ReadBlock(nAddr, nSize);
44
45   // TODO: find a way to decompress the zip-file in menory without writing the file to disk
46   // TODO: use a platform independent path
47   std::string sFilename("/tmp/genicam.zip");
48   std::string retData;
49
50   try
51   {
52     std::ofstream os(sFilename.c_str(), std::ios::binary);
53     os.write((char*)(&data[0]), data.size());
54     os.flush();
55
56     struct zip* zz = zip_open(sFilename.c_str(), 0, 0);
57     if(zz == 0)
58       throw std::runtime_error("Error opening genicam zipfile");
59
60     struct zip_file* zf = zip_fopen_index(zz, 0, 0);
61     if(zf == 0)
62       throw std::runtime_error("Error opening file in zip archive");
63
64     boost::array<uint8_t, 1024> buff;
65
66     int nRead = 0;
67     while((nRead = zip_fread(zf, buff.data(), buff.size())) != 0)
68       std::copy(buff.begin(), buff.begin()+nRead, std::back_inserter(retData));
69
70     // clean up file from disk
71     boost::filesystem::remove(sFilename);
72   }
73   catch(std::exception& e)
74   {
75     boost::filesystem::remove(sFilename);
76     throw e;
77   }
78
79   setenv("GENICAM_ROOT_V1_1", GENICAM_ROOT_PATH, true);
80   m_cam._LoadXMLFromString(retData.c_str());
81 }
82
83 uint32_t GenICamManager::GetAddress(const std::string& sKey)
84 {
85   GenApi::INode* pN = m_cam._GetNode(sKey.c_str());
86   uint32_t nAddr = 0;
87   if(pN != 0)
88   {
89     GenICam::gcstring val, att;
90     if(pN->GetProperty("Address", val, att))
91     {
92       nAddr = boost::lexical_cast<uint32_t>(val);
93     }
94     if(pN->GetProperty("pAddress", val, att) && val.length() > 0)
95     {
96       std::string sTmp(val);
97       std::vector<std::string> parts;
98       boost::algorithm::split(parts, sTmp, boost::algorithm::is_any_of("\t"));
99       for(size_t i=0; i<parts.size(); ++i)
100       {
101         GenApi::INode* pAddrNode = m_cam._GetNode(parts[i].c_str());
102         assert(pAddrNode);
103         GenICam::gcstring sAddr, sAtt;
104         assert(pAddrNode->GetProperty("Value", sAddr, sAtt));
105         nAddr += boost::lexical_cast<uint32_t>(sAddr);
106       }
107     }
108   }
109   else
110     throw std::runtime_error(str(boost::format("Can't find address for '%1%'") % sKey));
111
112   return nAddr;
113 }
114
115 void GenICamManager::PrintNodes(bool bWithProperties) const
116 {
117   GenApi::NodeList_t nodes;
118   m_cam._GetNodes(nodes);
119
120   for(GenApi::NodeList_t::const_iterator it = nodes.begin(); it!=nodes.end(); ++it)
121   {
122     std::cout << "Node: " << (*it)->GetName(true) << std::endl;
123     if(bWithProperties)
124     {
125       GenICam::gcstring_vector props;
126       (*it)->GetPropertyNames(props);
127       for(GenICam::gcstring_vector::const_iterator pit = props.begin(); pit!=props.end(); ++pit)
128         std::cout << "\tProp: " << *pit << std::endl;
129     }
130   }
131 }
132
133