Squashed 'third_party/allwpilib_2016/' content from commit 7f61816

Change-Id: If9d9245880859cdf580f5d7f77045135d0521ce7
git-subtree-dir: third_party/allwpilib_2016
git-subtree-split: 7f618166ed253a24629934fcf89c3decb0528a3b
diff --git a/wpilibc/Athena/include/Vision/AxisCamera.h b/wpilibc/Athena/include/Vision/AxisCamera.h
new file mode 100644
index 0000000..b315938
--- /dev/null
+++ b/wpilibc/Athena/include/Vision/AxisCamera.h
@@ -0,0 +1,122 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2014. 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.  */
+/*----------------------------------------------------------------------------*/
+
+#pragma once
+
+#include <thread>
+#include <string>
+#include "HAL/cpp/priority_mutex.h"
+
+#include "ErrorBase.h"
+#include "Vision/ColorImage.h"
+#include "Vision/HSLImage.h"
+#include "nivision.h"
+
+/**
+ * Axis M1011 network camera
+ */
+class AxisCamera : public ErrorBase {
+ public:
+  enum WhiteBalance {
+    kWhiteBalance_Automatic,
+    kWhiteBalance_Hold,
+    kWhiteBalance_FixedOutdoor1,
+    kWhiteBalance_FixedOutdoor2,
+    kWhiteBalance_FixedIndoor,
+    kWhiteBalance_FixedFluorescent1,
+    kWhiteBalance_FixedFluorescent2
+  };
+
+  enum ExposureControl {
+    kExposureControl_Automatic,
+    kExposureControl_Hold,
+    kExposureControl_FlickerFree50Hz,
+    kExposureControl_FlickerFree60Hz
+  };
+
+  enum Resolution {
+    kResolution_640x480,
+    kResolution_480x360,
+    kResolution_320x240,
+    kResolution_240x180,
+    kResolution_176x144,
+    kResolution_160x120,
+  };
+
+  enum Rotation { kRotation_0, kRotation_180 };
+
+  explicit AxisCamera(std::string const &cameraHost);
+  virtual ~AxisCamera();
+
+  AxisCamera(const AxisCamera&) = delete;
+  AxisCamera& operator=(const AxisCamera&) = delete;
+
+  bool IsFreshImage() const;
+
+  int GetImage(Image *image);
+  int GetImage(ColorImage *image);
+  HSLImage *GetImage();
+  int CopyJPEG(char **destImage, unsigned int &destImageSize,
+               unsigned int &destImageBufferSize);
+
+  void WriteBrightness(int brightness);
+  int GetBrightness();
+
+  void WriteWhiteBalance(WhiteBalance whiteBalance);
+  WhiteBalance GetWhiteBalance();
+
+  void WriteColorLevel(int colorLevel);
+  int GetColorLevel();
+
+  void WriteExposureControl(ExposureControl exposureControl);
+  ExposureControl GetExposureControl();
+
+  void WriteExposurePriority(int exposurePriority);
+  int GetExposurePriority();
+
+  void WriteMaxFPS(int maxFPS);
+  int GetMaxFPS();
+
+  void WriteResolution(Resolution resolution);
+  Resolution GetResolution();
+
+  void WriteCompression(int compression);
+  int GetCompression();
+
+  void WriteRotation(Rotation rotation);
+  Rotation GetRotation();
+
+ private:
+  std::thread m_captureThread;
+  std::string m_cameraHost;
+  int m_cameraSocket = -1;
+  priority_mutex m_captureMutex;
+
+  priority_mutex m_imageDataMutex;
+  std::vector<uint8_t> m_imageData;
+  bool m_freshImage = false;
+
+  int m_brightness = 50;
+  WhiteBalance m_whiteBalance = kWhiteBalance_Automatic;
+  int m_colorLevel = 50;
+  ExposureControl m_exposureControl = kExposureControl_Automatic;
+  int m_exposurePriority = 50;
+  int m_maxFPS = 0;
+  Resolution m_resolution = kResolution_640x480;
+  int m_compression = 50;
+  Rotation m_rotation = kRotation_0;
+  bool m_parametersDirty = true;
+  bool m_streamDirty = true;
+  priority_mutex m_parametersMutex;
+
+  bool m_done = false;
+
+  void Capture();
+  void ReadImagesFromCamera();
+  bool WriteParameters();
+
+  int CreateCameraSocket(std::string const &requestString, bool setError);
+};