#! /usr/bin/python
# Note that daylight the instant of savings time change is 2 am, but that the siderial time change doesn't happen until noon UCT. (Or some such problem.)
#      The morning after daylight savings time change in the fall had daybreak and sunset wrong by 1 hour until noon of that day.
import time
import subprocess
import math
import string

offset_min=17.

am=True
am_sessions =[(3600000,960,540,10),(3600000,960,540,10),\
              (3600000,960,540,10)]  # 3 hours  6:10-9:10
mid=True
mid_sessions=[(3600000,960,540,10),(3600000,960,540,10),\
              (3600000,960,540,10),(3600000,960,540,10),\
              (3600000,960,540,10),(3600000,960,540,10)] # 6 hours, 0 minutes   9:10 to 15:10
pm=True
pm_sessions =[(3600000,960,540,10),(3600000,960,540,10)]  # 2 hours  15:17-17:17

if am or mid or pm:
    basicOptions=' --nopreview --metering matrix '
    print 'Starting test video...'
    videoCommand='/usr/bin/raspivid'+basicOptions+'--width 960 --height 540 --timeout 5000 --framerate 10 --output /home/pi/Camera/Videos/test.h264'
    print videoCommand
    p = subprocess.call(videoCommand, shell=True)
    print 'Test video ended...'

am_totalTime_min=0
for am_session in am_sessions:
    am_totalTime_min+=am_session[0]/60000.
print ' am_totalTime_min=',am_totalTime_min

mid_totalTime_min=0
for mid_session in mid_sessions:
    mid_totalTime_min+=mid_session[0]/60000.
print 'mid_totalTime_min=',mid_totalTime_min

pm_totalTime_min=0
for pm_session in pm_sessions:
    pm_totalTime_min+=pm_session[0]/60000.
print ' pm_totalTime_min=',pm_totalTime_min

# House front gate 37 degrees 14.321' N
#                 119 degrees 55.037' W
latitudeDeg=37+14.321/60.
latitudeRad=latitudeDeg*math.pi/180
longitudeWestDeg=119+55.037/60.
longitudeWestRad=longitudeWestDeg*math.pi/180

print 'Current time:',time.asctime()

def JulianDayFromTuple(t):
    a=math.floor((14-t.tm_mon)/12)
    y=t.tm_year+4800-a
    m=t.tm_mon+12*a-3
    JDN=t.tm_mday+math.floor((153*m+2)/5)+365*y+math.floor(y/4)-math.floor(y/100)+math.floor(y/400)-32045
    return JDN

def JulianTimeFromTuple(t):
    second=t.tm_sec
    minute=t.tm_min
    hour=t.tm_hour
    day=t.tm_mday
    month=t.tm_mon
    year=t.tm_year
    a=math.floor((14-month)/12)
    y=year+4800-a
    m=month+12*a-3
    JDN=day+math.floor((153*m+2)/5)+365*y+math.floor(y/4)-math.floor(y/100)+math.floor(y/400)-32045
    JD=JDN+(hour-12.)/24.+minute/1440.+second/86400.
    return JD

def UnixToJulianSeconds(t):
    return t+2440587.5*86400

def UnixToJulianDays(t):
    return t+2440587.5

def JulianToUnixSeconds(t):
    return t-2440587.5*86400

def JulianToUnixDays(t):
    return t-2440587.5

nowLocal=time.localtime()
nowLocalJulian=JulianTimeFromTuple(nowLocal)

epoch2000=time.mktime((2000,1,1,12,0,0,0,0,0))
epoch2000Julian=JulianTimeFromTuple(time.localtime(epoch2000))

# Julian cycle since Jan 1, 2000
n=int(JulianToUnixDays(nowLocalJulian)-JulianToUnixDays(epoch2000Julian))

# Approximate Solar Noon
Jstar=2451545.0009+longitudeWestDeg/360+n

# Solar Mean Anomaly
MDeg=(357.5291 + 0.98560028*(Jstar-2451545)) % 360
MRad=MDeg*math.pi/180

# Equation of Center
CDeg = 1.9148*math.sin(MRad) + 0.02*math.sin(2*MRad) + 0.0003*math.sin(3*MRad)

# Ecliptic Longitude
LambdaDeg=(MDeg + 102.9372 + CDeg + 180) % 360
LambdaRad=LambdaDeg*math.pi/180

# Solar Transit
Jtransit=Jstar + 0.0053*math.sin(MRad) - 0.0069*math.sin(2*LambdaRad)

# Earth Axis Tilt
tiltDeg=23.45
tiltRad=tiltDeg*math.pi/180

# Declination of the Sun
sinDelta=math.sin(LambdaRad)*math.sin(tiltRad)
cosDelta=math.cos(math.asin(sinDelta))
deltaRad=math.asin(sinDelta)
deltaDeg=deltaRad*180/math.pi

# Hour Angle
omega0Rad=math.acos((math.sin(-0.83*math.pi/180) - math.sin(latitudeRad)*sinDelta)/(math.cos(latitudeRad)*cosDelta))
omega0Deg=omega0Rad*180/math.pi

# Sunet and Sunrise
Jset=2451545.0009 + (omega0Deg+longitudeWestDeg)/360 + n + 0.0053*math.sin(MRad)-0.0069*math.sin(2*LambdaRad)
pm_startJset=Jset-(pm_totalTime_min-offset_min)/1440.
pm_stopJset=Jset+offset_min/1440.
Jrise=Jtransit-(Jset-Jtransit)
am_startJrise=Jrise-offset_min/1440.
am_stopJrise=Jrise+(am_totalTime_min-offset_min)/1440.

sunrise=time.asctime(time.localtime(86400*JulianToUnixDays(Jrise)))
sunset=time.asctime(time.localtime(86400*JulianToUnixDays(Jset)))
am_start=time.asctime(time.localtime(86400*JulianToUnixDays(am_startJrise)))
am_stop=time.asctime(time.localtime(86400*JulianToUnixDays(am_stopJrise)))
pm_start=time.asctime(time.localtime(86400*JulianToUnixDays(pm_startJset)))
pm_stop=time.asctime(time.localtime(86400*JulianToUnixDays(pm_stopJset)))

am_start=am_start[11:16]
am_stop=am_stop[11:16]
pm_start=pm_start[11:16]
pm_stop=pm_stop[11:16]

print 'Pictures start at',am_start
print '     Sun rises at',sunrise
print '  Pictures end at',am_stop
print 'Pictures start at',pm_start
print '      Sun sets at',sunset
print ' Pictures stop at',pm_stop

print 'Sequences scheduled:',
if am:
    print 'am',
if mid:
    print 'mid',
if pm:
    print 'pm',
if am or mid or pm:
    print
else:
    print 'NONE!!!'
    import sys
    sys.exit()

if am:
    start=False
    while not start:
        time.sleep(25)
        currentTime=time.asctime()
        currentTime=currentTime[11:16]
        start=am_start==currentTime

    for session in am_sessions:
        s=time.asctime()
        fileName=s[4:7]+'-'+string.replace(s[8:10],' ','0')+'-'+s[11:13]+s[14:16]+s[17:19]+'-'+s[20:]+'-'+str(session[0]/1000)+'-'+str(session[1])+'x'+str(session[2])+'x'+str(session[3])
        videoCommand='/usr/bin/raspivid'+basicOptions+'--width '+str(session[1])+' --height '+str(session[2])+' --timeout '+str(session[0])+' --framerate '+str(session[3])+' --output /home/pi/Camera/Videos/'+fileName+'.h264'
        print videoCommand
        p = subprocess.call(videoCommand, shell=True)
        pid=subprocess.Popen(["/usr/bin/scp /home/pi/Camera/Videos/"+fileName+".h264 marren@marren:/media/Maxtor-1/Camera/Videos/"+fileName+".h264"],shell=True).pid

if mid:
    for session in mid_sessions:
        s=time.asctime()
        fileName=s[4:7]+'-'+string.replace(s[8:10],' ','0')+'-'+s[11:13]+s[14:16]+s[17:19]+'-'+s[20:]+'-'+str(session[0]/1000)+'-'+str(session[1])+'x'+str(session[2])+'x'+str(session[3])
        videoCommand='/usr/bin/raspivid'+basicOptions+'--width '+str(session[1])+' --height '+str(session[2])+' --timeout '+str(session[0])+' --framerate '+str(session[3])+' --output /home/pi/Camera/Videos/'+fileName+'.h264'
        print videoCommand
        p = subprocess.call(videoCommand, shell=True)
        pid=subprocess.Popen(["/usr/bin/scp /home/pi/Camera/Videos/"+fileName+".h264 marren@marren:/media/Maxtor-1/Camera/Videos/"+fileName+".h264"],shell=True).pid

if pm:
    start=False
    while not start:
        time.sleep(25)
        currentTime=time.asctime()
        currentTime=currentTime[11:16]
        start=pm_start==currentTime

    for session in pm_sessions:
        s=time.asctime()
        fileName=s[4:7]+'-'+string.replace(s[8:10],' ','0')+'-'+s[11:13]+s[14:16]+s[17:19]+'-'+s[20:]+'-'+str(session[0]/1000)+'-'+str(session[1])+'x'+str(session[2])+'x'+str(session[3])
        videoCommand='/usr/bin/raspivid'+basicOptions+'--width '+str(session[1])+' --height '+str(session[2])+' --timeout '+str(session[0])+' --framerate '+str(session[3])+' --output /home/pi/Camera/Videos/'+fileName+'.h264'
        print videoCommand
        p = subprocess.call(videoCommand, shell=True)
        pid=subprocess.Popen(["/usr/bin/scp /home/pi/Camera/Videos/"+fileName+".h264 marren@marren:/media/Maxtor-1/Camera/Videos/"+fileName+".h264"],shell=True).pid

output=subprocess.check_output(['/bin/ls','-l','Videos/'])
print output
