#! /usr/bin/python -i
# coding=utf-8

from usbterm import *

sys.ps1="PIRENA> "
sys.ps2="PIRENA. "

def Boot(f="flash_lauri/PIRENA.RBF"):
    altera_from_file(f)

PI_RUN = 0x40
PI_TMUX = 0x41
PI_SAMP = 0x42
PI_MUXREG = 0x50
PI_SIZE = 0x30

MSTAT_PLL     = 0x0001
MSTAT_TRIGGER = 0x0002
MSTAT_ACTIVE  = 0x0004

def run(first=0, last=7):
    if first<0 or last<first or last>15:
        raise ValueError
    Areg(MCSET, MCONF_FIFO & MSTAT_F1) # enable FIFO
    Areg(PI_RUN, "%d+16*%d" % (first,last))

def tmux(t=None, verb=True):
    if isinstance(t, float):
        t = int(t*96)
    return Areg(PI_TMUX, t, verb=verb)
    
def samp(nsam=None, tsam=2.5, sumen=True, verb=True):
    if isinstance(tsam, float):
        tsam = int(tsam*96)
    if nsam:
        return Areg(PI_SAMP, (sumen<<15)|((nsam-1)<<8)|tsam, verb=verb)
    else:
        return Areg(PI_SAMP, verb=verb)

def muxreg(i, cmux=None, enable=0x1ff, verb=True):
    if cmux==None:
        return Areg(PI_MUXREG+i, verb=verb)
    else:
        return Areg(PI_MUXREG+i, (cmux<<9)|enable, verb=verb) 

def PrintConf(f=sys.stderr):
    print >>f, "Tmux: %.3f µs" % (tmux(verb=False)/96.0)
    s = samp(verb=False)
    print >>f, "Tsamp: %.3f µs" % ((s & 0xff)/96.0)
    print >>f, "Nsamp: %d" % (((s>>8)&0x7f)+1)
    print >>f, "Sum enable: %d" % (s>>15)
    for i in range(16):
        s = muxreg(i, verb=False)
        print "Mux %d: 0x%x 0x%03x" % (i, s>>9, s&0x1ff)

def fifoconf(n):
    Cmd("altera/register 0x30 %d-1" % n)

def fiforead():
    n = Areg(RF1S) & 0xfff
    d = []
    while n>0:
        if n>256:
            nn=256
        else:
            nn=n
        n -= nn;
        Areg(PI_SIZE, nn-1)
        d += FifoDump(nn)
    i = 0;
    r = []
    m = []
    while i<len(d):
        if d[i]==0x9adc:
            if m or r:
                r.append(m)
            print
            i+=1
            m=[]
        elif i+1<len(d):
            ch = d[i+1] >> 8
            v = ((d[i+1]&0xff)<<16) + d[i]
	    if v>=0x800000:
		v -= 0x1000000
            m.append((ch,v))
            print "%02x" % ch, v
            i+=2
        else:
            print "trailing word 0x%04x" % d[i]
            i+=1
    if m:
        r.append(m)
    return r

try:
    execfile("pirenarc.py")
except IOError, e:
    print >>sys.stderr, e

