import sensor, image, time, lcd, math
from pyb import UART


uart = UART(3, 115200)
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.QQVGA2) # Special 128x160 framesize for LCD Shield.
sensor.skip_frames(10)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False)
lcd.init(type=1) # Initialize the lcd screen.
clock = time.clock()
lcd.display(sensor.snapshot())
message="       "


thresholds = [(0, 100, 16, 127, -96, 127),
            (0, 100, -128, -28, -128, 127),
            (0, 100, -128, 127, -128, -17)]
red_k=0
green_k=1
blue_k=2

roi_1=(0,10,160,45)
roi_2=(0,65,160,45)
roi_line1_1=(0,10,160,10)
roi_line1_2=(0,55,160,55)
roi_line2_1=(0,65,160,65)
roi_line2_2=(0,110,160,110)
f=0
q=0
s=0

while(True):
    img = sensor.snapshot().replace(vflip=True, hmirror=False, transpose=True )
    lcd.display(img)
    if uart.any():
        a=uart.readline().decode().strip()
        print(a)
        if a=='1' and q==0:
            print(1)
            uart.write("   *   \r\n")
            flagcode=1
            i=0.003
            while(flagcode==1):
                clock.tick()
                img = sensor.snapshot().replace(vflip=True, hmirror=False, transpose=True )
                img.lens_corr(i) # strength of 1.8 is good for the 2.8mm lens.
                lcd.display(img)
                codes=img.find_qrcodes()
                for code in img.find_qrcodes():
                    img.draw_rectangle(code.rect(), color = (255, 0, 0))

                    lcd.display(img)
                    if code.payload() :
                        print(code)
                        message=code.payload()
                        flagcode=0
                        q=1
                        f=1
                i+=0.003
            uart.write(message+'\r\n')
        if a=='2' and s==0:
            f=1
            print(2)
            uart.write("   *   \r\n")
            flag=1
            while flag==1:
                clock.tick()
                img = sensor.snapshot().replace(vflip=True, hmirror=False, transpose=True )
                img.draw_line(roi_line1_1)
                img.draw_line(roi_line1_2)

                lcd.display(img)
                blobs=img.find_blobs([thresholds[green_k]],roi=roi_1, pixels_threshold=200, area_threshold=200, merge=True)
                if blobs:
                    a1=[]
                    c1=[]
                    for b in blobs:
                        img.draw_rectangle(b[0:4])
                        img.draw_cross(b[5], b[6],(0,255,0))
                        lcd.display(img)
                        a1.append(b[4])
                        c1.append(b[5])
                    d1=max(a1)
                    gg=a1.index(d1)
                    gg1=c1[gg]
                    blobs=img.find_blobs([thresholds[red_k]],roi=roi_1, pixels_threshold=200, area_threshold=200, merge=True)
                    if blobs:
                        a2=[]
                        c2=[]
                        for b in blobs:
                            img.draw_rectangle(b[0:4])
                            img.draw_cross(b[5], b[6],(255,0,0))

                            lcd.display(img)
                            a2.append(b[4])
                            c2.append(b[5])
                        d2=max(a2)
                        rr=a2.index(d2)
                        rr1=c2[rr]
                        blobs=img.find_blobs([thresholds[blue_k]],roi=roi_1, pixels_threshold=200, area_threshold=200, merge=True)
                        if blobs:
                                a3=[]
                                c3=[]
                                for b in blobs:
                                    img.draw_rectangle(b[0:4])
                                    img.draw_cross(b[5], b[6],(0,0,255))

                                    lcd.display(img)
                                    a3.append(b[4])
                                    c3.append(b[5])
                                d3=max(a3)
                                bb=a3.index(d3)
                                bb1=c3[bb]
                                w=[]
                                w.append(rr1)
                                w.append(gg1)
                                w.append(bb1)
                                w_max=0
                                w_min=200
                                for index in range(0,3):
                                    if w[index]>w_max :
                                        w_max=w[index]
                                    if w[index]<w_min :
                                        w_min=w[index]
                                w1=w.index(w_max)+1
                                w3=w.index(w_min)+1
                                w2=5-w1-w3+1
                                upcolor='{}{}{}-'.format(str(w1),str(w2),str(w3))
                                flag=0
                                print(upcolor)
            flag=1
            while flag==1:
                clock.tick()
                #img = image.Image("660mm.bmp", copy_to_fb=True)
                img = sensor.snapshot().replace(vflip=True, hmirror=False, transpose=True )
                img.draw_line(roi_line2_1)
                img.draw_line(roi_line2_2)

                lcd.display(img)
                blobs=img.find_blobs([thresholds[green_k]],roi=roi_2, pixels_threshold=200, area_threshold=200, merge=True)
                if blobs:
                    a1=[]
                    c1=[]
                    for b in blobs:
                        img.draw_rectangle(b[0:4])
                        img.draw_cross(b[5], b[6],(0,255,0))

                        lcd.display(img)
                        a1.append(b[4])
                        c1.append(b[5])
                    d1=max(a1)
                    gg=a1.index(d1)
                    gg1=c1[gg]
                    blobs=img.find_blobs([thresholds[red_k]],roi=roi_2, pixels_threshold=200, area_threshold=200, merge=True)
                    if blobs:
                        a2=[]
                        c2=[]
                        for b in blobs:
                            img.draw_rectangle(b[0:4])
                            img.draw_cross(b[5], b[6],(255,0,0))

                            lcd.display(img)
                            a2.append(b[4])
                            c2.append(b[5])
                        d2=max(a2)
                        rr=a2.index(d2)
                        rr1=c2[rr]
                        blobs=img.find_blobs([thresholds[blue_k]],roi=roi_2, pixels_threshold=200, area_threshold=200, merge=True)
                        if blobs:
                                a3=[]
                                c3=[]
                                for b in blobs:
                                    img.draw_rectangle(b[0:4])
                                    img.draw_cross(b[5], b[6],(0,0,255))

                                    lcd.display(img)
                                    a3.append(b[4])
                                    c3.append(b[5])
                                d3=max(a3)
                                bb=a3.index(d3)
                                bb1=c3[bb]
                                w=[]
                                w.append(rr1)
                                w.append(gg1)
                                w.append(bb1)
                                w_max=0
                                w_min=200
                                for index in range(0,3):
                                    if w[index]>w_max :
                                        w_max=w[index]
                                    if w[index]<w_min :
                                        w_min=w[index]
                                w1=w.index(w_max)+1
                                w3=w.index(w_min)+1
                                w2=5-w1-w3+1
                                downcolor='{}{}{}\r\n'.format(str(w1),str(w2),str(w3))
                                flag=0
                                print(downcolor)
            uart.write(upcolor+downcolor)
            s=1