25 #ifndef INCLUDED_CheckFirmwareVersion_h_GUID_C1356250_0CF2_4595_83A5_1522F8AC6795 26 #define INCLUDED_CheckFirmwareVersion_h_GUID_C1356250_0CF2_4595_83A5_1522F8AC6795 32 #include <boost/assert.hpp> 34 #include <boost/algorithm/string/erase.hpp> 35 #include <boost/algorithm/string/predicate.hpp> 36 #include <boost/algorithm/string/replace.hpp> 37 #include <boost/lexical_cast.hpp> 45 #ifdef OSVR_HAVE_CODECVT 48 #else // !OSVR_HAVE_CODECVT 49 #include <boost/locale/encoding_utf.hpp> 50 #endif // OSVR_HAVE_CODECVT 58 static const auto CAMERA_FIRMWARE_UPGRADE_REQUIRED = 6;
59 static const auto CURRENT_CAMERA_FIRMWARE_VERSION = 7;
61 template <
typename T>
inline std::string wideToUTF8String(
T input) {
62 #ifdef OSVR_HAVE_CODECVT 63 std::wstring_convert<std::codecvt_utf8<wchar_t> > strCvt;
64 return strCvt.to_bytes(input);
65 #else // !OSVR_HAVE_CODECVT 66 return boost::locale::conv::utf_to_utf<char>(input);
67 #endif // OSVR_HAVE_CODECVT 70 template <
typename T>
inline std::wstring narrowToWideString(
T input) {
71 #ifdef OSVR_HAVE_CODECVT 72 std::wstring_convert<std::codecvt_utf8<wchar_t> > strCvt;
73 return strCvt.from_bytes(input);
74 #else // !OSVR_HAVE_CODECVT 75 return boost::locale::conv::utf_to_utf<wchar_t>(input);
76 #endif // OSVR_HAVE_CODECVT 79 enum class FirmwareStatus {
88 inline FirmwareStatus checkCameraFirmwareRevision(std::string path) {
90 FirmwareStatus ret = FirmwareStatus::Unknown;
93 auto endOfPath = path.find(
"#{");
94 if (endOfPath != std::string::npos) {
95 path.erase(endOfPath);
100 static const auto prefixString =
"\\\\?\\";
101 static const auto prefixLength = 4;
102 BOOST_ASSERT(std::strlen(prefixString) == prefixLength);
104 if (boost::algorithm::starts_with(path, prefixString)) {
105 boost::algorithm::erase_head(path, prefixLength);
110 boost::algorithm::ireplace_all(path,
"#",
"\\\\");
111 std::wstring wpath = narrowToWideString(path);
122 CoCreateInstance(CLSID_WbemLocator,
nullptr, CLSCTX_INPROC_SERVER,
123 IID_IWbemLocator, AttachPtr(locator));
124 if (FAILED(result)) {
135 result = locator->ConnectServer(
136 bstr_t(L
"ROOT\\CIMV2"),
140 WBEM_FLAG_CONNECT_USE_MAX_WAIT,
144 AttachPtr(wbemServices)
147 if (FAILED(result)) {
154 CoSetProxyBlanket(wbemServices.get(), RPC_C_AUTHN_WINNT,
155 RPC_C_AUTHZ_NONE,
nullptr, RPC_C_AUTHN_LEVEL_CALL,
156 RPC_C_IMP_LEVEL_IMPERSONATE,
nullptr, EOAC_NONE);
158 if (FAILED(result)) {
165 L
"SELECT * FROM Win32_PnPEntity WHERE DeviceID=\"" + wpath + L
"\"";
168 result = wbemServices->ExecQuery(bstr_t(L
"WQL"), bstr_t(query.c_str()),
169 WBEM_FLAG_FORWARD_ONLY |
170 WBEM_FLAG_RETURN_IMMEDIATELY,
171 nullptr, AttachPtr(devEnum));
172 if (FAILED(result)) {
173 std::cout <<
"Query failed!" << std::endl;
179 HRESULT hr = devEnum->Next(WBEM_INFINITE, 1,
180 AttachPtr(wbemClassObj), &numObjRet);
182 if (FAILED(hr) || numObjRet == 0) {
186 using comutils::Variant;
188 using comutils::containsArray;
189 using comutils::getArray;
193 Variant varHardwareID;
194 hr = wbemClassObj->Get(L
"HardwareID", 0,
195 AttachVariant(varHardwareID),
nullptr,
197 if (!containsArray<std::wstring>(varHardwareID)) {
199 std::cout <<
"HardwareID doesn't contain a string array! VT is " 200 << varHardwareID.get().vt << std::endl;
205 for (
auto &&hwid : getArray<std::wstring>(varHardwareID)) {
206 auto narrow = wideToUTF8String(hwid);
208 auto loc = narrow.find(
"REV_");
209 if (loc != std::string::npos) {
210 auto revString = narrow.substr(loc);
212 boost::algorithm::erase_head(revString, 4);
215 std::istringstream iss(revString);
219 if (rev < CAMERA_FIRMWARE_UPGRADE_REQUIRED) {
220 ret = FirmwareStatus::UpgradeRequired;
222 }
else if (rev < CURRENT_CAMERA_FIRMWARE_VERSION) {
223 ret = FirmwareStatus::UpgradeUseful;
224 }
else if (rev > CURRENT_CAMERA_FIRMWARE_VERSION) {
225 ret = FirmwareStatus::Future;
227 <<
"\n[Video-based Tracking] Detected camera " 232 ret = FirmwareStatus::Good;
245 #endif // INCLUDED_CheckFirmwareVersion_h_GUID_C1356250_0CF2_4595_83A5_1522F8AC6795 Header with a template alias for the desired COM smart pointer.
The main namespace for all C++ elements of the framework, internal and external.
Definition: namespace_osvr.dox:3
Header defining a wrapper for COM's VARIANT type.
A small structure to hold a non zero as a triplet (i,j,value).
Definition: SparseUtil.h:148
boost::intrusive_ptr< T > Ptr
Template alias for our desired COM smart pointer.
Definition: ComPtr.h:40