Это слишком медленно - PullRequest
0 голосов
/ 16 июня 2019

У меня следующий код работает очень хорошо, но он WAY слишком медленный - что-то вроде 3/4 секунды. Это выполняется на Raspberry Pi 3+ под Raspbian Stretch с браузером chromium в качестве клиента и apache2 в качестве сервера, оба на одном Pi. Имеется 5-дюймовый монитор, но не подключена клавиатура или мышь. Устройство имеет четыре переключателя, прикрепленных к контактам GPIO, и каждая из кнопок управляет курсором. Две кнопки перемещают изображение курсора вверх и вниз, а две другие контролировать текст поверх изображения курсора.После каждого нажатия кнопки я нажимаю клавишу (F5, в коде ниже) для браузера с помощью pynput.keyboard. Я уверен, что причина, по которой это слишком медленно, в данный момент я обновление всего экрана после обновления контрольных значений в файлах в / run / thermostat. Лучшим решением было бы эмулировать UpArrow и DnArrow, чтобы перемещать выделенное изображение или обновлять текст, в зависимости от обстоятельств. Отправка соответствующего контрольного кода проста , но как мне переместить изображение или изменить текст, не выполняя полное обновление страницы? (Обратите внимание, это также позволило бы мне использовать клавиатуру из внешнего браузера, чтобы делать то же самое)

Фрагмент внешнего скрипта Python, который отслеживает состояние кнопки:

import RPi.GPIO as GPIO
import time, os
from pins import pinsarrow
from pynput.keyboard import Key, Controller
keyboard = Controller()
...
def my_callback4(channel):
        Exists = os.path.exists('/run/thermostat/Cursor') # Check to see Cursor position is set
        if Exists:
                Fsize = os.path.getsize('/run/thermostat/Cursor') # Check for a valid file
                if Fsize == 0:
                        Write_Cursor(0)
                Cursor = Read_Cursor()
                if Cursor > 0:
                        Cursor = Cursor - 1
                        Write_Cursor(Cursor)      # Write the new Cursor position
##################################################
                        keyboard.press(Key.f5)   #
                        keyboard.release(Key.f5) #
##################################################
        else:
                Write_Cursor(0)                  # File does not exist.  Write the Cursor file.
GPIO.add_event_detect(pinsarrow[0], GPIO.RISING, callback=my_callback1, bouncetime=100)  
GPIO.add_event_detect(pinsarrow[1], GPIO.RISING, callback=my_callback2, bouncetime=100)
GPIO.add_event_detect(pinsarrow[2], GPIO.RISING, callback=my_callback3, bouncetime=100)
GPIO.add_event_detect(pinsarrow[3], GPIO.RISING, callback=my_callback4, bouncetime=100)


Фрагмент кода Python, который создает веб-страницу:

Exists = os.path.exists('/run/thermostat/Cursor') # Check to see the Cursor position has been set
if Exists:
        Fsize = os.path.getsize('/run/thermostat/Cursor')
        if Fsize > 0:
                with open("/run/thermostat/Cursor","r") as f: # Get the Cursor position
                        Cursor = int(f.read())
        else:
                write_Cursor()  # No value in Cursor file
else:
        write_Cursor()  # Cursor file does not exist

RunStatus = ["Heating On", "Cooling On", "Fan On", "Idle"]

print('Content-type: text/html\n')
print("\n")
with open("/usr/lib/cgi-bin/index.txt","r") as f:
        x = f.read()
        print(x)
######################################################################
## Places the cursor image at a position specified by variable Cursor#
######################################################################
print('<img src="/images/Thermostat-Cursor.png" width="100" height="29" style="position: absolute; left: 15px; top: ',65 + 30 * Cursor,'px;">', sep='')

############################################################
## Check for cursor position and set color text accordingly#
############################################################
bColor = ["0", "0", "0", "0", "0", "0", "0"]
for x in range(0, 7):
        if Cursor == x:
                bColor[x] = "black"
        else:
                bColor[x] = "rgb(200,200,200)"
## Print each <div> with appropriate color
print('<div style="color:',bColor[0],'" class="Scale">',ClassValues[0][LineValue[0]],'</div>', sep="")
print('<div style="color:',bColor[1],'" class="Clock">',ClassValues[1][LineValue[1]],'</div>', sep="")
print('<div style="color:',bColor[2],'" class="Barometer">',ClassValues[2][LineValue[2]],'</div>', sep="")
print('<div style="color:',bColor[3],'" class="Server">',ClassValues[3][LineValue[3]],'</div>', sep="")
print('<div style="color:',bColor[4],'" class="Control">',ClassValues[4][LineValue[4]],'</div>', sep="")
if LineValue[4] < 2:
        print('<div style="color:',bColor[5],'" class="Hot">Cool: ',ClassValues[5],'</div>', sep="")
if LineValue[4] == 0 or LineValue[4] == 2:
        print('<div style="color:',bColor[6],'" class="Cold">Heat: ',ClassValues[6],'</div>', sep="")
...