#!/usr/bin/env python
#version    :       2024.03.07
#language   :       en
#hardware   :       PI


from maix import display
from maix import image
from maix import camera
import os
import time
import random
import sys
sys.path.append("/root/")
from CocoPi import QMI8658
from CocoPi import BUTTON
from maix import mjpg
from maix import utils
import base64
import time

cameraSize = True
def CAMERATYPE():
    global cameraSize
    try:
        if os.path.exists("/etc/cameraSize.cfg"):
            cameraSize = True
        else:
            cameraSize = False
    except:
        cameraSize = False

CAMERATYPE()


def v831_display_show_canvas(displayShow):
    global _canvas_y,_canvas_x,ScreenOrientation,cameraSize
    CANVASSHOWIMGAGE = ""
    if ScreenOrientation:
        displayShowCanvas = image.new(size = (240, 320))
        displayShowCanvas.draw_rectangle(0,0,240,320, color=(0,0,0), thickness=-1)
        displayShowCanvas.draw_image(displayShow,_canvas_x,_canvas_y,alpha=1)
        displayShowVER = displayShowCanvas.crop(0,0,240,320)
        displayShowVER = displayShowVER.rotate(-90, adjust=1)
        display.show(displayShowVER)
    else:
        displayShowCanvas = image.new(size = (320, 240))
        displayShowCanvas.draw_rectangle(0,0,320,240, color=(0,0,0), thickness=-1)
        displayShowCanvas.draw_image(displayShow,_canvas_x,_canvas_y,alpha=1)
        display.show(displayShowCanvas)


ScreenOrientation = False
_canvas_x = 0
_canvas_y = 0

key_C = BUTTON(13)

image.load_freetype("/root/preset/fonts/botPixel.ttf")
if cameraSize==True:
    camera.camera.config(size=(320,240))
else:
    camera.camera.config(size=(240,320))
x = random.randrange(100, 141, 10)
y = random.randrange(100, 141, 10)
x1 = random.randrange(100, 141, 10)
y1 = random.randrange(100, 141, 10)
a = [{"x":x - 30, "y":y}, {"x":x - 20, "y":y}, {"x":x - 10, "y":y}, {"x":x, "y":y}]
canvas = image.new(size = (320, 240))
#-------------------------------
#初始化色彩配置
splash_theme_color = (255,255,255)
splash_front_color = (60,60,60)
fontcolor=255
fontsize=1.4

#开机显示
splash = image.new(size=(320, 240),mode = "RGB")
splash.draw_rectangle(0,0,320,240,color=splash_theme_color,thickness=-1)
splash.draw_string(60, 48, "Gluttonous", 1.5, color=(255, 200, 0))
splash.draw_string(120, 88, "Snake", 1.5, color=(255, 128, 64))
display.show(splash)
time.sleep(1)

#初始化设置
qmi8658=QMI8658()
#校准
qmi8658.calibrate()
#标定初始方位
initData={}
initData["AcX"]=qmi8658.get_accel(10)["AcX"]
initData["AcY"]=qmi8658.get_accel(10)["AcY"]
initData["AcZ"]=qmi8658.get_accel(10)["AcZ"]
initData["GyX"]=qmi8658.get_accel(10)["GyX"]
initData["GyY"]=qmi8658.get_accel(10)["GyY"]
initData["GyZ"]=qmi8658.get_accel(10)["GyZ"]



angle_x = 0
angle_y = 0
score_count = 0
direction = "RIGHT"
isFinsh = False
b = {"x":250, "y":250}
c = {"x":250, "y":250}
while True:
    angle_x = round(qmi8658.getPitchYawRollGxGyGz(initData)[0],2)
    angle_y = round(qmi8658.getPitchYawRollGxGyGz(initData)[1],2)
    canvas.clear()
    if x == x1 and y == y1:
        x1 = random.randrange(10, 311, 10)
        y1 = random.randrange(10, 231, 10)
        score_count = score_count + 1
        for j in a:
            if j.get("x") == x1 and j.get("y") == y1:
                x1 = x1 + 10
                y1 = y1 + 10
    else:
        if angle_y > 30 and direction != "DOWN":
            direction = "UP"
            y = y - 10
            b = {"x":x, "y":y}
            if x == x1 and y == y1:
                x1 = random.randrange(10, 311, 10)
                y1 = random.randrange(10, 231, 10)
                score_count = score_count + 1
                a.append({"x":x, "y":y})
                for j in a:
                    if j.get("x") == x1 and j.get("y") == y1:
                        x1 = x1 + 10
                        y1 = y1 + 10
            elif y == -10:
                isFinsh = True
            else:
                c = a[0]
                a.pop(0)
                for k in a:
                    if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                        isFinsh = True
                a.append({"x":x, "y":y})
        elif angle_y < -30 and direction != "UP":
            direction = "DOWN"
            y = y + 10
            b = {"x":x, "y":y}
            if x == x1 and y == y1:
                x1 = random.randrange(10, 311, 10)
                y1 = random.randrange(10, 231, 10)
                score_count = score_count + 1
                a.append({"x":x, "y":y})
                for j in a:
                    if j.get("x") == x1 and j.get("y") == y1:
                        x1 = x1 + 10
                        y1 = y1 + 10
            elif y == 240:
                isFinsh = True
            else:
                c = a[0]
                a.pop(0)
                for k in a:
                    if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                        isFinsh = True
                a.append({"x":x, "y":y})
        elif angle_x < -30 and direction != "RIGHT":
            direction = "LEFT"
            x = x - 10
            b = {"x":x, "y":y}
            if x == x1 and y == y1:
                x1 = random.randrange(10, 311, 10)
                y1 = random.randrange(10, 231, 10)
                score_count = score_count + 1
                a.append({"x":x, "y":y})
                for j in a:
                    if j.get("x") == x1 and j.get("y") == y1:
                        x1 = x1 + 10
                        y1 = y1 + 10
            elif x == -10:
                isFinsh = True
            else:
                c = a[0]
                a.pop(0)
                for k in a:
                    if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                        isFinsh = True
                a.append({"x":x, "y":y})
        elif angle_x > 30 and direction != "LEFT":
            direction = "RIGHT"
            x = x + 10
            b = {"x":x, "y":y}
            if x == x1 and y == y1:
                x1 = random.randrange(10, 311, 10)
                y1 = random.randrange(10, 231, 10)
                score_count = score_count + 1
                a.append({"x":x, "y":y})
                for j in a:
                    if j.get("x") == x1 and j.get("y") == y1:
                        x1 = x1 + 10
                        y1 = y1 + 10
            elif x == 320:
                isFinsh = True
            else:
                c = a[0]
                a.pop(0)
                for k in a:
                    if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                        isFinsh = True
                a.append({"x":x, "y":y})
        else:
            if direction == "UP":
                y = y - 10
                b = {"x":x, "y":y}
                if y == -10:
                    isFinsh = True
                else:
                    c = a[0]
                    a.pop(0)
                    for k in a:
                        if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                            isFinsh = True
                    a.append({"x":x, "y":y})
            elif direction == "DOWN":
                y = y + 10
                b = {"x":x, "y":y}
                if y == 240:
                    isFinsh = True
                else:
                    c = a[0]
                    a.pop(0)
                    for k in a:
                        if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                            isFinsh = True
                    a.append({"x":x, "y":y})
            elif direction == "LEFT":
                x = x - 10
                b = {"x":x, "y":y}
                if x == -10:
                    isFinsh = True
                else:
                    c = a[0]
                    a.pop(0)
                    for k in a:
                        if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                            isFinsh = True
                    a.append({"x":x, "y":y})
            else:
                x = x + 10
                b = {"x":x, "y":y}
                if x == 320:
                    isFinsh = True
                else:
                    c = a[0]
                    a.pop(0)
                    for k in a:
                        if k.get("x") == b.get("x") and k.get("y") == b.get("y"):
                            isFinsh = True
                    a.append({"x":x, "y":y})
    if isFinsh == True:
        canvas.clear()
        canvas.draw_string(60,40, "Gameover!", scale = 1.5, color = (255,255,255) , thickness = 1)
        canvas.draw_string(85,90, "Score:", scale = 1.5, color = (255,0,0) , thickness = 1)
        canvas.draw_string(210,90, (str(score_count)), scale = 1.5, color = (255,0,0) , thickness = 1)
        canvas.draw_string(30,150, "Press", scale = 1, color = (255,255,255) , thickness = 1)
        canvas.draw_string(105,150, "C", scale = 1, color = (255,255,255) , thickness = 1)
        canvas.draw_string(125,150, "TO", scale = 1, color = (255,255,255) , thickness = 1)
        canvas.draw_string(165,150, "Restart!", scale = 1, color = (255,255,255) , thickness = 1)
        v831_display_show_canvas(canvas)
        if (key_C.is_pressed()):
            while key_C.is_pressed():
                time.sleep(0.001)
            angle_x = 0
            angle_y = 0
            score_count = 0
            direction = "RIGHT"
            isFinsh = False
            x = random.randrange(100, 141, 10)
            y = random.randrange(100, 141, 10)
            x1 = random.randrange(100, 141, 10)
            y1 = random.randrange(100, 141, 10)
            a = [{"x":x - 30, "y":y}, {"x":x - 20, "y":y}, {"x":x - 10, "y":y}, {"x":x, "y":y}]
            b = {"x":250, "y":250}
            c = {"x":250, "y":250}
    else:
        canvas.draw_rectangle(c.get("x"),c.get("y"),10, 10, color=(0,0,0), thickness=-1)
        canvas.draw_rectangle(x1,y1, x1+10,y1+ 10, color=(255,255,255), thickness=-1)
        for i in a:
            x = i.get("x")
            y = i.get("y")
            canvas.draw_rectangle(x,y, x+10,y+ 10, color=(255,255,255), thickness=-1)
        v831_display_show_canvas(canvas)
    if isFinsh == False:
        time.sleep(0.2)
    else:
        pass

