This is the latest WPILib src, VisionSample2013, cRIO image, ... pulled down from firstforge.wpi.edu.

There might be risks in using the top of tree rather than an official release, but the commit messages do mention fixes for some deadlocks and race conditions.

git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4066 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/azaleasource/WPILibCProgramming/trunk/WPILib/Vision/IntCameraParameter.cpp b/azaleasource/WPILibCProgramming/trunk/WPILib/Vision/IntCameraParameter.cpp
new file mode 100644
index 0000000..d79ef9c
--- /dev/null
+++ b/azaleasource/WPILibCProgramming/trunk/WPILib/Vision/IntCameraParameter.cpp
@@ -0,0 +1,111 @@
+/*----------------------------------------------------------------------------*/

+/* 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;

+}

+