0

我和一个朋友正在 rasspberry pi 上制作一个数字仪表板,但是在结合 obd 代码和 pygame 时我们一直遇到问题。他们分开工作,但在一起是 pygame 或 obd 不起作用。最初我们尝试通过这种方式询问数据来做到这一点:

import obd
from  obd import OBDStatus
connection=obd.OBD("/dev/rfcomm0")
obd.logger.setLevel(obd.logging.DEBUG)

print (obd.OBD(fast=False , timeout =30,protocol = 0))
print(OBDStatus.ELM_CONNECTED)
print(OBDStatus.OBD_CONNECTED)
print(OBDStatus.CAR_CONNECTED)

cmd=obd.commands.SPEED 

response=connection.query(cmd)

print(response.value)

connection.close()

但是我们遇到了点火关闭的速度问题。现在我们从 obd 执行 watch 命令,现在 obd 部分工作,但 pygame 因此停止工作。我们真的不知道出了什么问题,因为我们在调试屏幕中停止了错误

这是组合代码:

import pygame
from pygame.locals import *
import obd

pygame.init()

def rotate(surface, angle, pivot, offset):
    rotated_image = pygame.transform.rotozoom(surface, -angle, 1)  
    rotated_offset = offset.rotate(angle)  
    
    rect = rotated_image.get_rect(center=pivot+rotated_offset)
    return rotated_image, rect

def get_speed(s):
    global speed
    if not s.is_null():
        speed = int(s.value.magnitude) #for kph
        print(speed)
def get_rpm(r):
    global rpm
    if not r.is_null():
        rpm = int(r.value.magnitude)
        print(rpm)
def get_load(l):
    global load
    if not l.is_null():
        load = int(l.value.magnitude)

def angle_up(angle):
    angle += 1
    return angle

def angle_down(angle):
   angle -= 1
   return angle

connection = obd.Async(fast=False)

connection.watch(obd.commands.SPEED, callback=get_speed)
connection.watch(obd.commands.RPM, callback=get_rpm)
connection.watch(obd.commands.ENGINE_LOAD, callback=get_load)
connection.start()

hoek1 = -225
hoek2 = -225
hoek3 = -226

speed = 0
rpm = 0
load = 0

SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080

offset = pygame.math.Vector2(162.5, 0)

center1 = int(SCREEN_WIDTH/5), int(SCREEN_HEIGHT/2)
center2 = int(SCREEN_WIDTH*(3/5)), int(SCREEN_HEIGHT/2)
center3 = SCREEN_WIDTH, int(SCREEN_HEIGHT/2)

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

clock = pygame.time.Clock()

running = True

Background = pygame.image.load('./graphics/Background.png').convert_alpha()

surf1 = pygame.image.load('./graphics/Wijzer.png').convert_alpha()
surf2 = pygame.image.load('./graphics/Wijzer.png').convert_alpha()
surf3 = pygame.image.load('./graphics/Wijzer.png').convert_alpha()

UPDATE =pygame.USEREVENT + 1
pygame.time.set_timer(UPDATE, 250)

while running:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                connection.stop()
                running = False
        elif event.type == QUIT:
            connection.stop()
            running = False
        elif event.type == UPDATE:
            if speed > hoek1:
                hoek1 = angle_up(hoek1)
            if speed < hoek1:
                hoek1 = angle_down(hoek1)
            if rpm > hoek2:
                hoek2 = angle_up(hoek2)
            if rpm < hoek2:
                hoek2 = angle_down(hoek2)
            if load > hoek3:
                hoek3 = angle_up(hoek3)
            if load < hoek3:
                hoek3 = angle_down(hoek3)

    if hoek1 > 45:
        hoek1 = 45
    if hoek2 > 45:
        hoek2 = 45
    if hoek3 > -135:
        hoek3 = -135
        
    if hoek1 < -225:
        hoek1 = -225
    if hoek2 < -225:
        hoek2 = -225
    if hoek3 < -225:
        hoek3 = -225

    surf1_rotated, surf_center1_rotated = rotate(surf1, hoek1, center1, offset)
    surf2_rotated, surf_center2_rotated = rotate(surf2, hoek2, center2, offset)
    surf3_rotated, surf_center3_rotated = rotate(surf3, hoek3, center3, offset)

    screen.blit(Background, (0,0))

    screen.blit(surf1_rotated, surf_center1_rotated)
    screen.blit(surf2_rotated, surf_center2_rotated)
    screen.blit(surf3_rotated, surf_center3_rotated)
    pygame.display.flip()

    clock.tick(30)
pygame.quit()

代码在这个 github 链接上: https ://github.com/EGO-mercenary/Dashboard

4

0 回答 0