copied everything over from 2012 and removed all of the actual robot code except the drivetrain stuff


git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4078 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/aos/atom_code/camera/Buffers.h b/aos/atom_code/camera/Buffers.h
new file mode 100644
index 0000000..7f1206d
--- /dev/null
+++ b/aos/atom_code/camera/Buffers.h
@@ -0,0 +1,93 @@
+#ifndef AOS_ATOM_CODE_CAMERA_CAMERA_BUFFERS_H_
+#define AOS_ATOM_CODE_CAMERA_CAMERA_BUFFERS_H_
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <string>
+
+#include "aos/aos_core.h"
+#include "aos/common/type_traits.h"
+
+namespace aos {
+namespace camera {
+
+class Reader;
+class Buffers {
+  // It has to do a lot of the same things as all the other ones, but it gets
+  // the information from different places (some of it gets sent out by it).
+  friend class Reader;
+  // Not an abstract name so that an existing one can just be unlinked without
+  // disturbing it if necessary (like with shm_link).
+  static const std::string kFDServerName;
+  // How many v4l2 buffers and other things that depend on that.
+  static const unsigned int kNumBuffers = 10;
+  // How many fds to transfer from the fd server.
+  // Used to make it clear which 1s are 1 and which are this.
+  static const size_t kNumFDs = 1;
+  // Creates a socket and calls either bind or connect.
+  // Returns a bound/connected socket or -1 (the reason for which will already
+  // have been logged at ERROR).
+  static int CreateSocket(int (*bind_connect)(int, const sockaddr *, socklen_t));
+
+  // File descriptor connected to the fd server. Used for detecting if the
+  // camera reading process has died.
+  // A value of -2 means don't check.
+  const int server_;
+  // Gets the fd (using server_).
+  int FetchFD();
+  // File descriptor for the v4l2 device (that's valid in this process of
+  // course).
+  const int fd_;
+
+  struct Buffer;
+  // Buffer[kNumBuffers]
+  Buffer *buffers_;
+  struct Message {
+    uint32_t index;
+    uint32_t bytesused;
+    timeval timestamp;
+    uint32_t sequence;
+  };
+  static_assert(shm_ok<Message>::value, "it's going through queues");
+  // The current one. Sometimes NULL.
+  const Message *message_;
+  static const std::string kQueueName;
+  static const aos_type_sig kSignature;
+  // NULL for the Reader one.
+  aos_queue *queue_;
+  // Make the actual mmap calls.
+  // Called by Buffers() automatically.
+  void MMap();
+ public:
+  Buffers();
+  // Will clean everything up.
+  // So that HTTPStreamer can create/destroy one for each client to make it
+  // simpler.
+  ~Buffers();
+
+  // Retrieves the next image. Will return the current one if it hasn't yet.
+  // Calls Release() at the beginning.
+  // NOTE: this means that the caller can't keep using references to the old
+  // return value after calling this function again
+  // block is whether to return NULL or wait for a new one
+  // the last 3 output parameters will be filled in straight from the
+  // v4l2_buffer if they're not NULL
+  // (see <http://v4l2spec.bytesex.org/spec/x5953.htm#V4L2-BUFFER> for details)
+  // NOTE: guaranteed to return a valid pointer if block is true
+  const void *GetNext(bool block,
+                uint32_t *bytesused, timeval *timestamp, uint32_t *sequence);
+  // Releases the most recent frame buffer. Automatically called by GetNext and
+  // the destructor. Safe to call multiple times without getting frames in
+  // between.
+  void Release();
+
+  // How big images are.
+  static const int32_t kWidth = 640, kHeight = 480;
+};
+
+} // namespace camera
+} // namespace aos
+
+#endif
+