def main():
    print "main"
    
    #num_processorhandlers = min(1,mproc.cpu_count-1)
    num_workhandlers = 2
    
    # set up data pipes and queue
    result_queue = mproc.Queue()
    datapipes = [mproc.Pipe(False) for i in xrange(num_workhandlers)]
    
    h_input = H.InputHandler(
                [datapipes[i][1] for i in xrange(num_workhandlers)],
                [inpSFG.inpSimpleFrameGrabber()])
                 
    h_work = [H.WorkerHandler(
                    datapipes[i][0], result_queue, [wrkDev.wrkDev()])
                for i in xrange(num_workhandlers)]
                
    waittime = [0,0]
    for i, handler in enumerate(h_work):
        handler.setup(waittime[i])
                
    h_output = H.OutputHandler(result_queue, [outSD.outSimpleDisplay()])
    processes = list([h_input, h_output])
    processes.extend(h_work)
    
    # start all the processes
    [p.start() for p in processes]
    
    #h_input.start()
    #h_output.start()
    #h_work[0].start()
    
    
    # cleaning up
    h_input.join() #close the input handler
    [handler.join() for handler in h_work] #wait for the workers to finish
    h_output.join() #wait for ouput to finish writing
    result_queue.close() #close the 
    result_queue.join_thread()
import plugins.wrkNull as wrkNull
import plugins.wrkInvert as wrkInv
import plugins.wrkEdgeFit as wrkEdge

import plugins.outSimpleDisplay as outSD
import plugins.outHistogram as outHG

inp = inpSFG.inpSimpleFrameGrabber()
inp1 = inpAFG.inpAveragingFrameGrabber()

#wrk0 = wrkNull.wrkNull()
#wrk1 = wrkInv.wrkInvert()
wrk2 = wrkEdge.wrkEdgeFit()

out0 = outSD.outSimpleDisplay() #display orginal
out1 = outSD.outSimpleDisplay() # display brighened orignal with edges overlay in red
out2 = outHG.outHistogram()




inp.setup()
inp1.setup()

#wrk0.setup([0,1])
#wrk1.setup([1])
wrk2.setup([1])

out0.setup([0,1])
out1.setup([0,2])
import plugins.inpSimpleFrameGrabber as inpSFG
import plugins.wrkEdgeFit as wrkEdge
import plugins.outSimpleDisplay as outSD
import plugins.outSimpleCSVWriter as outCSV

#initalise plugins
inp = inpSFG.inpSimpleFrameGrabber()
wrk2 = wrkEdge.wrkEdgeFit()
out3 = outCSV.outSimpleCSVWriter()
outDisp = outSD.outSimpleDisplay()

# setup input data tokens for plugins
inp.setup()
wrk2.setup([1])
out3.setup([0,2])
outDisp.setup([0,1])

#configure plugins
inp.config("move.avi")
wrk2.config()
out3.config("csvfile.csv")
outIWrt.config("path/for/images")

# trian the worker with 64 images
trainimg = []
for x in range(64):
    img = inp.getFrameNr(inp.nFrames//64*x)[1]
    trainimg.append(img)
wrk2.train(trainimg)

# reset the reader
import plugins.inpAveragingFrameGrabber as inpAFG

import plugins.wrkNull as wrkNull
import plugins.wrkInvert as wrkInv
import plugins.wrkEdgeFit as wrkEdge

import plugins.outSimpleDisplay as outSD
import plugins.outHistogram as outHG

inp = inpAFG.inpAveragingFrameGrabber()

#wrk0 = wrkNull.wrkNull()
#wrk1 = wrkInv.wrkInvert()
wrk2 = wrkEdge.wrkEdgeFit()

out0 = outSD.outSimpleDisplay()




inp.setup()


#wrk0.setup([0,1])
#wrk1.setup([1])
wrk2.setup([1])

out0.setup([0,1])
#out1.setup([0,2])

import plugins.outSimpleCSVWriter as outCSV
import plugins.outSaveFrame as outFrame

inp = inpSFG.inpSimpleFrameGrabber()
#inp1 = inpAFG.inpAveragingPlayPauseFrameGrabber()

#wrk0 = wrkNull.wrkNull()
#wrk1 = wrkInv.wrkInvert()
wrk2 = wrkEdge.wrkEdgeFit()

#out0 = outSD.outSimpleDisplay() #display orginal
#out1 = outSD.outSimpleDisplay() # display brighened orignal with edges overlay in red
#out2 = outHG.outHistogram()
out3 = outCSV.outSimpleCSVWriter()
outIWrt = outFrame.outSaveFrame()
outDisp = outSD.outSimpleDisplay() #display a frame on demand... (abuse the plugin)


inp.setup()
#inp1.setup()

#wrk0.setup([0,1])
#wrk1.setup([1])
wrk2.setup([1])

#out0.setup([0,1]) #display orginal image
#out1.setup([0,2]) #display the edidet file

out3.setup([0,2])
outIWrt.setup([0,1]) #remember: this plaugin is abused and not called with the datastream
outDisp.setup([0,1]) #remember: this plaugin is abused and not called with the datastream