#!/usr/bin/python

import os,sys,math;
import RPi.GPIO as GPIO;
import time;

GPIO.setmode(GPIO.BCM); #This correpsonds to the GPIO header diagram
#GPIO.setmode(GPIO.BOARD); #Board appears to be a different numbering for the pins

p1 = 26; #CLK
p2 = 13; #DOUT
p3 = 5; #CS

GPIO.setup(p1,GPIO.OUT); #CLK
GPIO.setup(p2,GPIO.IN); #DOUT
GPIO.setup(p3,GPIO.OUT); #CS/SHDN

print "\n\n\n";

def wait():
	time.sleep(1E-5);

	
def readADC(p1,p2,p3):
	bout = [];
	GPIO.output(p3,1); #CS high
	wait();
	GPIO.output(p1,0); #CLK low
	wait();
	GPIO.output(p3,0); #CS low
	wait();
	GPIO.output(p1,1); #CLK high
	wait();
	GPIO.output(p1,0); #CLK low
	wait();
	GPIO.output(p1,1); #CLK high
	wait();

	j = 0;
	for j in range(0,30):
		GPIO.output(p1,0);
		wait();
		GPIO.output(p1,1);
		wait();
		b = GPIO.input(p2);
		wait();
		#GPIO.output(p1,1);
		#wait();
		bout.append(b);

	GPIO.output(p3,1); #CS high
	wait();
	return bout;

def readADC2(p1,p2,p3):
	bout = readADC(p1,p2,p3);
	#skip bit 0
	#I see 23 1s after the first zero (should be 12 bits of resolution..)
	b2 = bout[1:13];
	aout = 0;
	den = 2**12*1.0;
	aout = aout + b2[0]*2**11;
	aout = aout + b2[1]*2**10;
	aout = aout + b2[2]*2**9;
	aout = aout + b2[3]*2**8;
	aout = aout + b2[4]*2**7;
	aout = aout + b2[5]*2**6;
	aout = aout + b2[6]*2**5;
	aout = aout + b2[7]*2**4;
	aout = aout + b2[8]*2**3;
	aout = aout + b2[9]*2**2;
	aout = aout + b2[10]*2**1;
	aout = aout + b2[11];
	aout = aout/den;

	return aout;


#print readADC(p1,p2,p3);
#time.sleep(1);
#print readADC(p1,p2,p3);
#time.sleep(1);
#print readADC(p1,p2,p3);

#while(1):
	#print readADC(p1,p2,p3);
	#print "\n";
#	print str(readADC2(p1,p2,p3))+"\n"; 

def mean(lst):
	q = 0;
	N = 0;
	for j in range(0,len(lst)):
		q = q + lst[j];
		N = N + 1;
	q = q/(N*1.0);
	return q;

fp = open("test_ADC.data","a");
fp.writelines("\n");
fp.writelines(time.strftime("%d/%m%Y %H:%M:%S"));
fp.writelines("\n");

while(1):
	j = 0;
	a = [];
	for j in range(0,5):
		a.append(readADC2(p1,p2,p3));
	print str(mean(a))+"\n";
	fp.writelines(str(mean(a))+"\n");

fp.close();

