#!/usr/bin/env python
# -*- coding: utf8 -*-

import os
import time
import shutil

def flash(count, target, firmware):
    flashed = []
    while len(flashed) != count:
        filelist = []
        try:
            filelist = os.listdir(target)
        except:
            pass
        oldflashed = flashed
        flashed = []
        for x in oldflashed:
            if x in filelist:
                flashed.append(x)
            else:
                print "removed %s" % x
        filelist = [x for x in filelist if x not in flashed]
        print "filelist", filelist
        for device in filelist:
            try:
                print "open", firmware
                f = open(firmware, "r")
                print "open", target + device
                dev = open(target + device, "w")
                dev.seek(0x800)
                print "write"
                dev.write(f.read())
                print "close f"
                f.close()
                print "close dev"
                dev.close()
                print "flashed %s" % device
            except Exception, ex:
                print "error!"
                print ex
            flashed.append(device)
        time.sleep(1)

def copy(count, target, dir):
    flashed = []
    #filestocopy = os.listdir(dir)
    os.mkdir("/tmp/r0ket")

    while len(flashed) != count:
        filelist = []
        while len(filelist) != count:
            try:
                filelist = os.listdir(target)
            except:
                pass
        oldflashed = flashed
        flashed = []
        for x in oldflashed:
            if x in filelist:
                flashed.append(x)
            else:
                print "removed %s" % x
        filelist = [x for x in filelist if x not in flashed]
        print "filelist:",filelist
        for device in filelist:
            try:
                time.sleep(0.3)
                print "mkdir", "/tmp/r0ket/"+device
                os.mkdir("/tmp/r0ket/"+device)
                print "mount -t vfat "+target+device+" "+"/tmp/r0ket/"+device
                x = 1
                while x != 0:
                    x = os.system("mount -t vfat "+target+device+" "+"/tmp/r0ket/"+device)
                    print "returned", x
                    if x != 0:
                        time.sleep(5)
                os.system("../tools/crypto/generate-keys")
                #for file in filestocopy:
                print     "cp "+dir+"/* /tmp/r0ket/"+device
                os.system("cp "+dir+"/* /tmp/r0ket/"+device)
                print "flashed %s" % device
            except Exception, ex:
                print "error!"
                print ex
            flashed.append(device)
        print "sync"
        os.system("sync")
        mounted = os.listdir("/tmp/r0ket")
        print "mounted", mounted
        for mount in mounted:
            print "touch /tmp/r0ket/"+mount+"/flashed.cfg"
            os.system("touch /tmp/r0ket/"+mount+"/flashed.cfg")
            print "sync"
            os.system("sync")
            time.sleep(1)
            print "umount /tmp/r0ket/"+mount
            os.system("umount /tmp/r0ket/"+mount)
            print "rm /tmp/r0ket/"+mount
            os.rmdir("/tmp/r0ket/"+mount)
        time.sleep(1)
    print "rm /tmp/r0ket"
    os.rmdir("/tmp/r0ket")

os.system("umount /tmp/r0ket/*")
os.system("rm /tmp/r0ket -rf")
os.system("rm /dev/r0ketflash/*")
while True:
    raw_input("Flashed firmware.\nNow cycle power and press enter.")
    flash(9, "/dev/lpcflash/", "initial.bin")
    raw_input("Flashed bootstrap firmware.\nNow cycle power and press enter.")
    copy(9, "/dev/r0ketflash/","files")
    flash(9, "/dev/lpcflash/", "final.bin")