blob: d79ef9c4f14fb71bbfe1ef87407de702c7ea8eda [file] [log] [blame]
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
/*----------------------------------------------------------------------------*/
#include "IntCameraParameter.h"
#include "pcre.h"
#include <stdio.h>
#include <string.h>
/**
* Constructor for an integer camera parameter.
* @param setString The string to set a value in the HTTP request
* @param getString The string to retrieve a value in the HTTP request
*/
IntCameraParameter::IntCameraParameter(const char *setString, const char *getString, bool requiresRestart)
{
m_changed = false;
m_value = 0;
m_setString = setString;
m_getString = getString;
m_requiresRestart = requiresRestart;
}
/**
* Get a value for a camera parameter.
* @returns The camera parameter cached valued.
*/
int IntCameraParameter::GetValue()
{
return m_value;
}
/**
* Set a value for a camera parameter.
* Mark the value for change. The value will be updated in the parameter
* change loop.
*/
void IntCameraParameter::SetValue(int value)
{
m_value = value;
m_changed = true;
}
/**
* Check if a parameter has changed and update.
* Check if a parameter has changed and send the update string if it
* has changed. This is called from the loop in the parameter task loop.
* @returns true if the camera needs to restart
*/
bool IntCameraParameter::CheckChanged(bool &changed, char *param)
{
changed = m_changed;
if (m_changed)
{
sprintf(param, m_setString, m_value);
m_changed = false;
return m_requiresRestart;
}
return false;
}
/**
* Get a parameter value from the string.
* Get a parameter value from the camera status string. If it has been changed
* been changed by the program, then don't update it. Program values have
* precedence over those written in the camera.
*/
void IntCameraParameter::GetParamFromString(const char *string, int stringLength)
{
char resultString[150];
if (SearchForParam(m_getString, string, stringLength, resultString) >= 0)
{
if (!m_changed) m_value = atoi(resultString);
}
}
/**
* @param pattern: the regular expression
* @param searchString the text to search
* @param searchStringLen the length of searchString
* @param result buffer to put resulting text into, must be pre-allocated
*/
int IntCameraParameter::SearchForParam(const char *pattern, const char *searchString, int searchStringLen, char *result)
{
int vectorLen = 10;
int resultVector[vectorLen];
const char *error;
int erroffset;
pcre *compiledPattern = pcre_compile(
pattern, //"root.Image.I0.Appearance.Resolution=(.*)",
PCRE_CASELESS,
&error, // for error message
&erroffset, // for error offset
NULL); // use default character tables
int rc;
rc = pcre_exec(compiledPattern,
NULL,
searchString,
searchStringLen,
0,
0,
resultVector, //locations of submatches
vectorLen); //size of ovector
int length = resultVector[3] - resultVector[2];
memcpy(result, &searchString[resultVector[2]], length);
result[length] = '\0';
return rc;
}