import ast
import copy
import packages.machine as machine
import packages.cube as cube
import packages.move as move
import sys
import pygame
import time
import sched
import kociemba
if 'Setup Pygame':
def draw_text(text, x, y, color):
text_surface = font.render(text, True, color)
screen.blit(text_surface, (x, y))
# Function to check if a point is inside a rectangle
def is_mouse_over(pos, rect):
return rect.left < pos[0] < rect.right and rect.top < pos[1] < rect.bottom
# Function to create a button
def draw_button(rect, color, text):
pygame.draw.rect(screen, color, rect)
draw_text(text, rect.x + 10, rect.y + 10, BLACK)
class Button:
rect = pygame.Rect
isPressed = False
name = "1"
def draw(self, screen):
if self.isPressed:
pygame.draw.rect(screen, (0, 255, 0), self.rect)
else:
pygame.draw.rect(screen, (0, 0, 0), self.rect)
draw_text(self.name, self.rect.x + 10, self.rect.y + 10, (255, 255, 255))
# ___VARIABLES___
# timing stuff
scheduler = sched.scheduler(time.time, time.sleep)
scheduler.run()
# Network Stuff
# pi_ip = '10.42.0.188'
pi_ip = '127.0.0.1'
url = "http://{0}:5000/".format(pi_ip)
# Pygame Stuff
# Define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (150, 150, 150)
screen_width, screen_height = 400, 300
buttons = []
buttonPoss = [
(130, 10, 50, 50),
(250, 130, 50, 50),
(130, 250, 50, 50),
(10, 130, 50, 50),
(130, 70, 50, 50),
(190, 130, 50, 50),
(130, 190, 50, 50),
(70, 130, 50, 50),
]
# key grabbing
buttonPressed = 0
number_input = ""
# Misc
# initialize classes
machine = machine.machine(url)
cube = cube.Cube()
# Initialize pygame
pygame.init()
# ___SETUP___
# Set up the screen
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Simple GUI with Pygame")
# Create a font
font = pygame.font.SysFont(None, 40)
# moveLists
setupMoves = move.MoveList(machine, csv_path='moveLists/scan.csv')
# Main function for GUI
if __name__ == "__main__":
# setup gui
for i, pos in enumerate(buttonPoss):
buttons.append(Button())
buttons[i].rect = pygame.Rect(pos)
buttons[i].name = str(i)
# camera = Camera()
# camera.convert_to_cube_string()
# exit(0)
solution = ["Rp", "Bn", "Bn", "Up", "Fn", "Fn", "Dn", "Fn", "Dn", "Bp", "Un", "Rp", "Un", "Un", "Rn", "Rn", "Dp",
"Fn", "Fn", "Un", "Un", "Fn", "Fn", "Rn", "Rn", "Un", "Un", "Rn", "Rn", "Fn", "Fn"]
clock = pygame.time.Clock()
# setupMoves.send_list_request()
# colours = machine.get_colours()
colours = [[[19.26974358974359, 83.34051282051281, 129.59794871794873],
[164.46966292134832, 152.26516853932586, 176.97303370786517],
[163.5367231638418, 48.13446327683616, 63.10960451977401],
[2.6155196629213484, 143.1936797752809, 26.899719101123594], [13.30875, 113.929375, 36.19625],
[227.25509868421054, 94.89226973684211, 60.01027960526316], [193.675, 80.9875, 62.13409090909091],
[22.031868131868134, 72.64505494505495, 119.65934065934066],
[175.7927786499215, 154.07142857142858, 184.9120879120879]],
[[54.97025641025641, 123.38666666666667, 43.06153846153846],
[175.02097378277153, 150.3056179775281, 175.95730337078652],
[164.66101694915255, 143.19887005649719, 170.81016949152541],
[201.55891853932584, 190.5191011235955, 37.26636235955056], [167.87375, 80.221875, 52.2075],
[46.561677631578945, 90.91973684210527, 163.14383223684212],
[164.22272727272727, 151.3, 53.28409090909091],
[45.15714285714286, 68.9032967032967, 115.05714285714286],
[172.58634222919937, 141.787284144427, 177.7951334379906]],
[[158.33333333333334, 152.81641025641025, 63.98871794871795],
[169.42846441947566, 49.161048689138575, 78.1558052434457],
[184.94915254237287, 88.29943502824858, 71.5909604519774],
[37.749087078651684, 93.24431179775281, 162.00365168539327], [144.206875, 127.104375, 154.109375],
[202.00888157894738, 13.303865131578947, 57.404111842105266],
[169.2068181818182, 133.9852272727273, 168.44431818181818],
[167.2010989010989, 72.52857142857142, 60.497802197802194],
[177.01412872841445, 39.61773940345369, 68.6342229199372]],
[[154.12923076923076, 24.49025641025641, 47.505641025641026],
[8.232958801498127, 127.19475655430712, 47.421722846441945],
[10.04858757062147, 80.22598870056497, 130.68926553672316],
[191.58918539325842, 13.671629213483145, 52.75498595505618], [23.83625, 71.448125, 122.02625],
[2.6790296052631577, 144.93651315789472, 34.22129934210526],
[36.30795454545454, 78.01022727272728, 132.0159090909091],
[140.67252747252746, 122.32307692307693, 147.24945054945056],
[168.1828885400314, 161.65149136577708, 59.6436420722135]],
[[45.05948717948718, 77.37538461538462, 127.04717948717949],
[167.5505617977528, 147.59101123595505, 174.8486891385768],
[33.616949152542375, 124.56497175141243, 41.9728813559322],
[195.0868679775281, 11.585323033707866, 37.41994382022472], [145.603125, 28.815, 46.724375],
[17.184703947368423, 147.0141447368421, 18.533141447368422],
[54.657954545454544, 119.45113636363637, 40.925],
[146.1010989010989, 138.87692307692308, 42.55604395604396],
[203.20800627943484, 94.10204081632654, 68.76923076923077]],
[[51.09641025641026, 115.78358974358974, 29.117948717948718],
[193.57977528089887, 88.43895131086143, 50.205243445692886],
[191.42372881355934, 84.62824858757062, 48.91864406779661],
[196.06327247191012, 182.5631320224719, 25.92808988764045], [146.165625, 136.5825, 34.326875],
[203.90057565789473, 184.34432565789473, 23.263240131578947],
[159.6909090909091, 35.23977272727273, 41.04318181818182],
[173.23406593406594, 72.04835164835166, 46.08571428571429],
[171.8877551020408, 157.5879120879121, 44.10596546310832]]]
print(1)
cube.make_cube_string(colours)
print(2)
# print(kociemba.solve(cube.cube_string))
#machine.solve_cube(cube.cube_string)
# setupMoves.execute()
# scanMoves.execute()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
# try:
# num = int(number_input)
# moves2.counter = num
# moves2.execute()
# except:
# pass
machine.set_angle(buttonPressed, number_input)
# print("Entered number:", number_input)
data_to_send = {
"component": "servo",
"index": buttonPressed,
"value": number_input,
}
number_input = ""
# response = requests.post(url, data=data_to_send)
elif event.key == pygame.K_BACKSPACE:
number_input = number_input[:-1]
elif event.key == pygame.K_UP:
buttonPressed = 2
elif event.key == pygame.K_RIGHT:
buttonPressed = 3
elif event.key == pygame.K_DOWN:
buttonPressed = 0
elif event.key == pygame.K_LEFT:
buttonPressed = 1
else:
number_input += event.unicode
if buttonPressed < 4:
if event.key == pygame.K_r:
machine.retract(buttonPressed)
elif event.key == pygame.K_e:
machine.extend(buttonPressed)
elif event.key == pygame.K_t:
machine.full_extend(buttonPressed)
elif event.key == pygame.K_a:
machine.goto(buttonPressed, 0)
elif event.key == pygame.K_s:
machine.goto(buttonPressed, 1)
elif event.key == pygame.K_d:
machine.goto(buttonPressed, 2)
elif event.key == pygame.K_f:
machine.goto(buttonPressed, 3)
elif event.key == pygame.K_q:
machine.move(buttonPressed, 1)
elif event.key == pygame.K_w:
machine.move(buttonPressed, -1)
elif event.key == pygame.K_1:
cube.rotate_side('U', 1)
elif event.key == pygame.K_2:
cube.rotate_side('L', 1)
elif event.key == pygame.K_3:
cube.rotate_side('F', 1)
elif event.key == pygame.K_4:
cube.rotate_side('R', 1)
elif event.key == pygame.K_5:
cube.rotate_side('B', 1)
elif event.key == pygame.K_6:
cube.rotate_side('D', 1)
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
mouse_pos = pygame.mouse.get_pos()
for i, button in enumerate(buttons):
button.isPressed = False
if is_mouse_over(mouse_pos, button.rect):
buttonPressed = i
button.isPressed = True
# # Check if the left mouse button is clicked on the buttons
if is_mouse_over(mouse_pos, pygame.Rect(150, 150, 100, 50)):
print("Button 1 clicked!")
elif is_mouse_over(mouse_pos, pygame.Rect(150, 220, 100, 50)):
print("Button 2 clicked!")
# tick the servos
# machine.tick()
# setupMoves.tick()
# moves2.tick()
# response = scanMoves.tick()
# if response:
# cube.cube_string.append(response)
# print(cube.cube_string)
machine.tick()
# Clear the screen
screen.fill(GRAY)
# Draw the input field
#pygame.draw.rect(screen, GRAY, pygame.Rect(10, 10, 200, 40))
draw_text(number_input, 20, 20, BLACK)
#pygame.draw.rect(screen, GRAY, pygame.Rect(10, 10, 200, 40))
# draw the cube net
colourSideDict = {
"U": (255, 255, 255),
"F": (0, 255, 0),
"L": (255, 0, 0),
"R": (255, 128, 0),
"B": (0, 0, 255),
"D": (255, 255, 0)
}
cube_index_positions = [
[3, 0], [4, 0], [5, 0],
[3, 1], [4, 1], [5, 1],
[3, 2], [4, 2], [5, 2],
[6, 3], [7, 3], [8, 3],
[6, 4], [7, 4], [8, 4],
[6, 5], [7, 5], [8, 5],
[3, 3], [4, 3], [5, 3],
[3, 4], [4, 4], [5, 4],
[3, 5], [4, 5], [5, 5],
[3, 6], [4, 6], [5, 6],
[3, 7], [4, 7], [5, 7],
[3, 8], [4, 8], [5, 8],
[0, 3], [1, 3], [2, 3],
[0, 4], [1, 4], [2, 4],
[0, 5], [1, 5], [2, 5],
[9, 3], [10, 3], [11, 3],
[9, 4], [10, 4], [11, 4],
[9, 5], [10, 5], [11, 5],
]
for i, item in enumerate(cube.cube_string):
pygame.draw.rect(screen, colourSideDict[item], pygame.Rect(
20 * cube_index_positions[i][0],
20 * cube_index_positions[i][1], 20, 20))
# Draw buttons
#for button in buttons:
#button.draw(screen)
# draw_button(pygame.Rect(150, 150, 100, 50), BLACK, "Button 1")
# draw_button(pygame.Rect(150, 220, 100, 50), BLACK, "Button 2")
# Update the display
pygame.display.flip()
clock.tick(20)