import serial
import sys

def write_reg( reg, value ) :
    ser.write( "%s %x\n" % (reg,value) )
    l = ser.readline()
    w = l.split()
    v = int(w[2],16)
    if v != value :
        print "register write failed %s %x %x\n" % (reg,value,v)

ser = serial.Serial('/dev/ttyS0', 9600)
cmd = sys.argv[1]

if cmd == "flash" :
    write_reg( "ddrc", 0xff );
    for x in xrange(0,256) :
        write_reg( "portc", 255-x );
elif cmd == "freq" :
    freq = 118
    range = 3
    if len(sys.argv) > 2 :
        freq = int( sys.argv[2] )
        if len(sys.argv) > 3 :
            range = int( sys.argv[3] )
    write_reg( "ddrb", 0x08 )
    write_reg( "tccr0a", 0x42 )
    write_reg( "tccr0b", range & 0x7 )
    write_reg( "ocr0a", freq )
elif cmd == "pwm" :
    period = 250
    duty = 25 
    range = 3
    if len(sys.argv) > 2 :
        period = int( sys.argv[2] )
        if len(sys.argv) > 3 :
            duty = float( sys.argv[3] ) / 100.0
            duty = int(duty * period )
            if len(sys.argv) > 4 :
                range = int( sys.argv[4] )
    write_reg( "ddrb", 0x18 )
    write_reg( "tccr0a", 0x23 )
    write_reg( "tccr0b", (range & 0x7) | 0x08 )
    write_reg( "ocr0a", period )
    write_reg( "ocr0b", duty )
elif cmd == "pwm2" :
    dutyA = 64
    dutyB = 154
    range = 2
    if len(sys.argv) > 2 :
        dutyA = float( sys.argv[2] ) / 100.0
        dutyA = int(dutyA * 256 )
        if len(sys.argv) > 3 :
            dutyB = float( sys.argv[3] ) / 100.0
            dutyB = int(dutyB * 256 )
            if len(sys.argv) > 4 :
                range = int( sys.argv[4] )
    write_reg( "ddrb", 0x18 )
    write_reg( "tccr0a", 0xa3 )
    write_reg( "tccr0b", range & 0x7 )
    write_reg( "ocr0a", dutyA )
    write_reg( "ocr0b", dutyB )

ser.close()

