37 #include "UniquePointer.h"
39 namespace ArgusSamples
43 static const char *VERSION =
"1.0";
46 static const char *ELEMENT_DEVICE_INDEX =
"deviceIndex";
47 static const char *ELEMENT_SENSOR_MODE_INDEX =
"sensorModeIndex";
48 static const char *ELEMENT_VERBOSE =
"verbose";
49 static const char *ELEMENT_KPI =
"kpi";
50 static const char *ELEMENT_EXPOSURE_TIME_RANGE =
"exposureTimeRange";
51 static const char *ELEMENT_GAIN_RANGE =
"gainRange";
52 static const char *ELEMENT_FRAME_RATE =
"frameRate";
53 static const char *ELEMENT_FRAME_RATE_RANGE =
"frameRateRange";
54 static const char *ELEMENT_FOCUS_POSITION =
"focusPosition";
55 static const char *ELEMENT_APERTURE_POSITION =
"aperturePosition";
56 static const char *ELEMENT_APERTURE_MOTOR_SPEED =
"apertureMotorSpeed";
57 static const char *ELEMENT_CAPTURE_YUV_FORMAT =
"captureYuvFormat";
58 static const char *ELEMENT_AE_ANTIBANDING_MODE =
"aeAntibandingMode";
59 static const char *ELEMENT_AE_LOCK =
"aeLock";
60 static const char *ELEMENT_AWB_LOCK =
"awbLock";
61 static const char *ELEMENT_AWB_MODE =
"awbMode";
62 static const char *ELEMENT_EXPOSURE_COMPENSATION =
"exposureCompensation";
63 static const char *ELEMENT_ISP_DIGITAL_GAIN_RANGE =
"ispDigitalGainRange";
64 static const char *ELEMENT_DENOISE_MODE =
"denoiseMode";
65 static const char *ELEMENT_DENOISE_STRENGTH =
"denoiseStrength";
66 static const char *ELEMENT_EDGE_ENHANCE_MODE =
"edgeEnhanceMode";
67 static const char *ELEMENT_EDGE_ENHANCE_STRENGTH =
"edgeEnhanceStrength";
68 static const char *ELEMENT_STILL_FILE_TYPE =
"stillFileType";
69 static const char *ELEMENT_VIDEO_FORMAT =
"videoFormat";
70 static const char *ELEMENT_VIDEO_FILE_TYPE =
"videoFileType";
71 static const char *ELEMENT_VIDEO_BIT_RATE =
"videoBitRate";
72 static const char *ELEMENT_OUTPUT_SIZE =
"outputSize";
73 static const char *ELEMENT_OUTPUT_PATH =
"outputPath";
74 static const char *ELEMENT_DE_FOG_ENABLE =
"deFogEnable";
75 static const char *ELEMENT_DE_FOG_AMOUNT =
"deFogAmount";
76 static const char *ELEMENT_DE_FOG_QUALITY =
"deFogQaulity";
78 static void XMLCALL xmlHandleData(
void *parser,
const char *s,
int len)
80 XML_Parser p = (XML_Parser)parser;
81 std::string *data =
reinterpret_cast<std::string*
>(XML_GetUserData(p));
86 static void XMLCALL xmlStartElement(
void *parser,
const char *name,
const char **atts)
88 XML_Parser p = (XML_Parser)parser;
90 if (strcmp(name,
"argusconfig") == 0)
92 const char **curAtt = atts;
94 while (*curAtt != NULL)
96 const char *attribute = curAtt[0];
97 const char *value = curAtt[1];
99 if (strcmp(attribute,
"version") == 0)
101 if (strcmp(value, VERSION) != 0)
103 ORIGINATE_ERROR_FAIL(
"Unsupported version '%s' expected version '%s'",
108 ORIGINATE_ERROR_FAIL(
"Found unexpected attribute '%s'", attribute);
113 XML_SetCharacterDataHandler(p, xmlHandleData);
118 XML_StopParser(p, XML_FALSE);
129 template<
typename T>
static bool checkValue(
const char *elementName,
const char *dataStr,
130 const char *valueName, Value<T> &value,
bool *match)
132 if (strcmp(elementName, valueName) == 0)
134 PROPAGATE_ERROR(value.setFromString(dataStr));
141 static void XMLCALL xmlEndElement(
void *parser,
const char *name)
144 XML_Parser p = (XML_Parser)parser;
145 std::string *data =
reinterpret_cast<std::string*
>(XML_GetUserData(p));
147 if (strcmp(name, ELEMENT_DEVICE_INDEX) == 0)
149 PROPAGATE_ERROR_FAIL(dispatcher.m_deviceIndex.setFromString(data->c_str()));
151 else if (strcmp(name, ELEMENT_SENSOR_MODE_INDEX) == 0)
153 PROPAGATE_ERROR_FAIL(dispatcher.m_sensorModeIndex.setFromString(data->c_str()));
155 else if (strcmp(name, ELEMENT_VERBOSE) == 0)
157 PROPAGATE_ERROR_FAIL(dispatcher.m_verbose.setFromString(data->c_str()));
159 else if (strcmp(name, ELEMENT_KPI) == 0)
161 PROPAGATE_ERROR_FAIL(dispatcher.m_kpi.setFromString(data->c_str()));
163 else if (strcmp(name, ELEMENT_EXPOSURE_TIME_RANGE) == 0)
165 PROPAGATE_ERROR_FAIL(dispatcher.m_exposureTimeRange.setFromString(data->c_str()));
167 else if (strcmp(name, ELEMENT_GAIN_RANGE) == 0)
169 PROPAGATE_ERROR_FAIL(dispatcher.m_gainRange.setFromString(data->c_str()));
171 else if (strcmp(name, ELEMENT_FRAME_RATE) == 0)
173 PROPAGATE_ERROR_FAIL(dispatcher.m_frameRate.setFromString(data->c_str()));
175 else if (strcmp(name, ELEMENT_FRAME_RATE_RANGE) == 0)
177 PROPAGATE_ERROR_FAIL(dispatcher.m_frameRateRange.setFromString(data->c_str()));
179 else if (strcmp(name, ELEMENT_FOCUS_POSITION) == 0)
181 PROPAGATE_ERROR_FAIL(dispatcher.m_focusPosition.setFromString(data->c_str()));
183 else if (strcmp(name, ELEMENT_APERTURE_POSITION) == 0)
185 PROPAGATE_ERROR_FAIL(dispatcher.m_aperturePosition.setFromString(data->c_str()));
187 else if (strcmp(name, ELEMENT_APERTURE_MOTOR_SPEED) == 0)
189 PROPAGATE_ERROR_FAIL(dispatcher.m_apertureMotorSpeed.setFromString(data->c_str()));
191 else if (strcmp(name, ELEMENT_CAPTURE_YUV_FORMAT) == 0)
193 PROPAGATE_ERROR_FAIL(dispatcher.m_captureYuvFormat.setFromString(data->c_str()));
195 else if (strcmp(name, ELEMENT_DENOISE_MODE) == 0)
197 PROPAGATE_ERROR_FAIL(dispatcher.m_denoiseMode.setFromString(data->c_str()));
199 else if (strcmp(name, ELEMENT_DENOISE_STRENGTH) == 0)
201 PROPAGATE_ERROR_FAIL(dispatcher.m_denoiseStrength.setFromString(data->c_str()));
203 else if (strcmp(name, ELEMENT_EDGE_ENHANCE_MODE) == 0)
205 PROPAGATE_ERROR_FAIL(dispatcher.m_edgeEnhanceMode.setFromString(data->c_str()));
207 else if (strcmp(name, ELEMENT_EDGE_ENHANCE_STRENGTH) == 0)
209 PROPAGATE_ERROR_FAIL(dispatcher.m_edgeEnhanceStrength.setFromString(data->c_str()));
211 else if (strcmp(name, ELEMENT_AE_ANTIBANDING_MODE) == 0)
213 PROPAGATE_ERROR_FAIL(dispatcher.m_aeAntibandingMode.setFromString(data->c_str()));
215 else if (strcmp(name, ELEMENT_AE_LOCK) == 0)
217 PROPAGATE_ERROR_FAIL(dispatcher.m_aeLock.setFromString(data->c_str()));
219 else if (strcmp(name, ELEMENT_AWB_LOCK) == 0)
221 PROPAGATE_ERROR_FAIL(dispatcher.m_awbLock.setFromString(data->c_str()));
223 else if (strcmp(name, ELEMENT_AWB_MODE) == 0)
225 PROPAGATE_ERROR_FAIL(dispatcher.m_awbMode.setFromString(data->c_str()));
227 else if (strcmp(name, ELEMENT_EXPOSURE_COMPENSATION) == 0)
229 PROPAGATE_ERROR_FAIL(dispatcher.m_exposureCompensation.setFromString(data->c_str()));
231 else if (strcmp(name, ELEMENT_ISP_DIGITAL_GAIN_RANGE) == 0)
233 PROPAGATE_ERROR_FAIL(dispatcher.m_ispDigitalGainRange.setFromString(data->c_str()));
235 else if (strcmp(name, ELEMENT_STILL_FILE_TYPE) == 0)
237 PROPAGATE_ERROR_FAIL(dispatcher.m_stillFileType.setFromString(data->c_str()));
239 else if (strcmp(name, ELEMENT_VIDEO_FORMAT) == 0)
241 PROPAGATE_ERROR_FAIL(dispatcher.m_videoFormat.setFromString(data->c_str()));
243 else if (strcmp(name, ELEMENT_VIDEO_FILE_TYPE) == 0)
245 PROPAGATE_ERROR_FAIL(dispatcher.m_videoFileType.setFromString(data->c_str()));
247 else if (strcmp(name, ELEMENT_VIDEO_BIT_RATE) == 0)
249 PROPAGATE_ERROR_FAIL(dispatcher.m_videoBitRate.setFromString(data->c_str()));
251 else if (strcmp(name, ELEMENT_OUTPUT_SIZE) == 0)
253 PROPAGATE_ERROR_FAIL(dispatcher.m_outputSize.setFromString(data->c_str()));
255 else if (strcmp(name, ELEMENT_OUTPUT_PATH) == 0)
257 PROPAGATE_ERROR_FAIL(dispatcher.m_outputPath.set(*data));
259 else if (strcmp(name, ELEMENT_DE_FOG_ENABLE) == 0)
261 PROPAGATE_ERROR_FAIL(dispatcher.m_deFogEnable.setFromString(data->c_str()));
263 else if (strcmp(name, ELEMENT_DE_FOG_AMOUNT) == 0)
265 PROPAGATE_ERROR_FAIL(dispatcher.m_deFogAmount.setFromString(data->c_str()));
267 else if (strcmp(name, ELEMENT_DE_FOG_QUALITY) == 0)
269 PROPAGATE_ERROR_FAIL(dispatcher.m_deFogQuality.setFromString(data->c_str()));
271 else if (strcmp(name,
"argusconfig") == 0)
276 ORIGINATE_ERROR_FAIL(
"Unhandled element '%s'.", name);
279 XML_SetCharacterDataHandler(p, NULL);
285 XML_StopParser(p, XML_FALSE);
290 if (configFile == NULL)
291 ORIGINATE_ERROR(
"'configFile' is NULL");
297 UniquePointer<char> fileData;
298 XML_Parser parser = NULL;
302 xmlFile = fopen(configFile,
"rb");
304 ORIGINATE_ERROR_FAIL(
"Failed to open file %s", configFile);
307 if (fseek(xmlFile, 0, SEEK_END) != 0)
308 ORIGINATE_ERROR_FAIL(
"Failed to read buffer file %s", configFile);
310 ftellResult = ftell(xmlFile);
311 if (ftellResult == -1)
312 ORIGINATE_ERROR_FAIL(
"Failed to read buffer file %s", configFile);
313 if (ftellResult == 0)
314 ORIGINATE_ERROR_FAIL(
"Empty file %s", configFile);
316 fileSize = ftellResult;
318 if (fseek(xmlFile, 0, SEEK_SET) != 0)
319 ORIGINATE_ERROR_FAIL(
"Failed to read buffer file %s", configFile);
322 fileData.reset(
new char[fileSize + 1]);
324 ORIGINATE_ERROR_FAIL(
"Out of memory");
327 if (fread(fileData.get(), fileSize, 1, xmlFile) != 1)
328 ORIGINATE_ERROR_FAIL(
"Failed to read buffer file %s", configFile);
330 fileData.get()[fileSize] = 0;
333 parser = XML_ParserCreate(NULL);
335 ORIGINATE_ERROR_FAIL(
"Failed to create parser");
337 XML_UseParserAsHandlerArg(parser);
340 XML_SetUserData(parser, &data);
341 XML_SetElementHandler(parser, xmlStartElement, xmlEndElement);
344 if (XML_Parse(parser, fileData.get(), (int)fileSize, 1) == XML_STATUS_ERROR)
347 const XML_Size lineNumber = XML_GetCurrentLineNumber(parser);
348 const XML_Size columnNumber = XML_GetCurrentColumnNumber(parser);
349 const XML_Index byteIndex = XML_GetCurrentByteIndex(parser);
353 if ((byteIndex >= 0) && (static_cast<size_t>(byteIndex) < fileSize))
356 size_t lineStart =
static_cast<size_t>(byteIndex);
357 while ((lineStart > 0) && (fileData.get()[lineStart] !=
'\n'))
360 if (fileData.get()[lineStart] ==
'\n')
364 size_t lineEnd =
static_cast<size_t>(lineStart);
365 while ((lineEnd < fileSize) && (fileData.get()[lineEnd] !=
'\n'))
368 line.append(&fileData.get()[lineStart], lineEnd - lineStart);
375 ORIGINATE_ERROR_FAIL(
"%s at line %lu:%lu:\n%s",
376 XML_ErrorString(XML_GetErrorCode(parser)),
377 lineNumber, columnNumber, line.c_str());
387 XML_ParserFree(parser);
395 static void writeValue(std::ofstream &stream,
const char *name,
const std::string&
string)
397 stream <<
" <" << name <<
">" <<
string <<
"</" << name <<
">" << std::endl;
401 template<
typename T>
static void writeValue(std::ofstream &stream,
const char *name,
402 const Value<T> &value)
404 writeValue(stream, name, value.toString());
409 if (configFile == NULL)
410 ORIGINATE_ERROR(
"'configFile' is NULL");
415 std::ofstream stream(configFile, std::ofstream::out);
416 if (!stream.is_open())
417 ORIGINATE_ERROR(
"Failed to open file '%s' for saving.", configFile);
420 stream <<
"<?xml version='1.0' encoding='utf-8'?>" << std::endl;
421 stream <<
"<argusconfig version='" << VERSION <<
"'>" << std::endl;
424 writeValue(stream, ELEMENT_DEVICE_INDEX, dispatcher.
m_deviceIndex);
426 writeValue(stream, ELEMENT_VERBOSE, dispatcher.
m_verbose);
427 writeValue(stream, ELEMENT_KPI, dispatcher.
m_kpi);
429 writeValue(stream, ELEMENT_GAIN_RANGE, dispatcher.
m_gainRange);
430 writeValue(stream, ELEMENT_FRAME_RATE, dispatcher.
m_frameRate);
432 writeValue(stream, ELEMENT_FOCUS_POSITION, dispatcher.
m_focusPosition);
436 writeValue(stream, ELEMENT_DENOISE_MODE, dispatcher.
m_denoiseMode);
441 writeValue(stream, ELEMENT_AE_LOCK, dispatcher.
m_aeLock);
442 writeValue(stream, ELEMENT_AWB_LOCK, dispatcher.
m_awbLock);
443 writeValue(stream, ELEMENT_AWB_MODE, dispatcher.
m_awbMode);
446 writeValue(stream, ELEMENT_STILL_FILE_TYPE, dispatcher.
m_stillFileType);
447 writeValue(stream, ELEMENT_VIDEO_FORMAT, dispatcher.
m_videoFormat);
448 writeValue(stream, ELEMENT_VIDEO_FILE_TYPE, dispatcher.
m_videoFileType);
449 writeValue(stream, ELEMENT_VIDEO_BIT_RATE, dispatcher.
m_videoBitRate);
450 writeValue(stream, ELEMENT_OUTPUT_SIZE, dispatcher.
m_outputSize);
451 writeValue(stream, ELEMENT_OUTPUT_PATH, dispatcher.
m_outputPath.get());
452 writeValue(stream, ELEMENT_DE_FOG_ENABLE, dispatcher.
m_deFogEnable);
453 writeValue(stream, ELEMENT_DE_FOG_AMOUNT, dispatcher.
m_deFogAmount);
454 writeValue(stream, ELEMENT_DE_FOG_QUALITY, dispatcher.
m_deFogQuality);
457 stream <<
"</argusconfig>" << std::endl;