lots of vision stuff from Ben
diff --git a/vision/PacketNotifier.cpp b/vision/PacketNotifier.cpp
new file mode 100644
index 0000000..ca62f5f
--- /dev/null
+++ b/vision/PacketNotifier.cpp
@@ -0,0 +1,78 @@
+#include "vision/PacketNotifier.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+
+namespace frc971 {
+namespace vision {
+	
+void PacketNotifier::RegisterSender(){
+	close(fd[1]);
+}
+void PacketNotifier::RegisterReciever(){
+	close(fd[0]);
+}
+PacketNotifier *PacketNotifier::MMap(size_t data_size){
+	PacketNotifier *data;
+	data = (PacketNotifier *)mmap(NULL, ((data_size * 3 + 4095 + sizeof(PacketNotifier)) / 4096) * 4096, 
+			PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+	data->data_size = data_size;
+	socketpair(PF_LOCAL, SOCK_STREAM, 0, data->fd);
+	for(int i = 0;i < 3;i++){
+		data->buffs[i] = (uint8_t *)data + (sizeof(PacketNotifier) + i * data_size);
+	}
+	void *place = &(data->mutex);
+	*((int *)place) = 0; // The Mutex class needs a placement new operator. (you know, keep the masses happy);
+	data->in_flight = false;
+	data->to_send = -1;
+	data->sending = -1;
+	return data;
+}
+void *PacketNotifier::GetBuffer(){
+	mutex.Lock();
+	for(int i = 0; i < 3 ; i++){ //search for open spot.
+		if(i != sending && i != to_send){ //open
+			filling = i;
+			mutex.Unlock();
+			printf("leasing out to fill buff # %d\n",i);
+			return buffs[i];
+		}
+	}
+	mutex.Unlock();
+	printf("Error in the fabric of the universe\n");
+	exit(-42);
+}
+void PacketNotifier::Notify(){
+	mutex.Lock();
+	to_send = filling;
+	filling = -1;
+	mutex.Unlock();
+	// wall error
+	if(write(fd[0],"\n",1)) {}
+}
+
+void PacketNotifier::DataSent(const void * /*data*/, size_t /*datalen*/){
+	printf("packet_sent: %d; fill: %d; to_send: %d \n",sending,filling,to_send);
+	mutex.Lock();
+	sending = -1;
+	mutex.Unlock();
+	in_flight = false;
+}
+bool PacketNotifier::GetData(char **place_to_put,size_t *length){
+	if(in_flight) return false;
+	mutex.Lock();
+	*length = data_size;
+	*place_to_put = (char *)buffs[to_send];
+	sending = to_send;
+	to_send = -1;
+	mutex.Unlock();
+	in_flight = true;
+	return true;
+}
+
+}  // namespace vision
+}  // namespace frc971
+