262 lines
11 KiB
Python
262 lines
11 KiB
Python
import serial
|
|
from serial import SerialException
|
|
import datetime
|
|
import binascii
|
|
import logging
|
|
import time
|
|
import json
|
|
|
|
import re
|
|
|
|
# Configuration Data (later to be put in Panel2Net.conf)
|
|
# SerialPort: Name of RPi serial port receiving the panel data
|
|
# SerialPort = "COM1"
|
|
SerialPort = "COM2"
|
|
# BaudRate: Serial port speed (Baud, Default will be adjusted later)
|
|
BaudRate = 19200
|
|
# PackageByTime: Time Duration until a package is closed
|
|
# and sent off (seconds)
|
|
PackageByTime = 0.1
|
|
# PackageByLength* Length (in bytes) of data input
|
|
# until a package is closed and sent off
|
|
PackageByLength = 128
|
|
# PackageByLength = 256 попробовать нужно !!!!!!!!!!!!!!!!!!!!
|
|
# PackageByLength = 80
|
|
|
|
# MaxBuffer before flushing (in order to avoid buffer overflow)
|
|
BufferMax = 2000
|
|
|
|
|
|
# LogFileName: Name of LogFile
|
|
current_time = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
LogFileName = f"timer_megasport5_{current_time}.log"
|
|
# LogFileSize Maximum Size of LogFile (in Mbytes)
|
|
LogFileSize = 10
|
|
# LogLevel Minimum Severity Level to be logged (see severity in Logs)
|
|
LogLevel = "E"
|
|
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format="%(asctime)s %(levelname)s %(message)s",
|
|
filename=LogFileName,
|
|
filemode="w",
|
|
)
|
|
|
|
def hexspace(string, length):
|
|
return ' '.join(string[i:i+length] for i in range(0,len(string),length))
|
|
|
|
ser = serial.Serial()
|
|
ser.port = SerialPort
|
|
ser.baudrate = BaudRate
|
|
ser.bytesize = serial.EIGHTBITS
|
|
# number of bits per bytes
|
|
ser.parity = serial.PARITY_NONE
|
|
# set parity check: no parity
|
|
ser.stopbits = serial.STOPBITS_ONE
|
|
# number of stop bits
|
|
ser.timeout = PackageByTime
|
|
# non-block read
|
|
ser.xonxoff = False
|
|
# disable software flow control
|
|
ser.rtscts = False
|
|
# disable hardware (RTS/CTS) flow control
|
|
ser.dsrdtr = False
|
|
# disable hardware (DSR/DTR) flow control
|
|
ser.writeTimeout = 2
|
|
# timeout for write
|
|
|
|
PATH = (
|
|
r"D:\ГРАФИКА\БАСКЕТБОЛ\ЕДИНАЯ ЛИГА ВТБ 2022-2023\python\JSON\timer_basketball.json"
|
|
)
|
|
new_data = {
|
|
"timeGFX": "0.0",
|
|
"time_attackGFX": "",
|
|
"quarter": "0",
|
|
"points1": "0",
|
|
"points2": "0",
|
|
"foul1": "0",
|
|
"foul2": "0",
|
|
"foul_pic1": "",
|
|
"foul_pic2": "",
|
|
"time_attac_pic": "",
|
|
}
|
|
with open(PATH, "w", encoding="utf-8") as file:
|
|
json.dump([new_data], file, ensure_ascii=False, indent=4)
|
|
|
|
|
|
while True:
|
|
try:
|
|
print("Initializing")
|
|
ser.close()
|
|
ser.open()
|
|
if ser.is_open:
|
|
try:
|
|
ser.reset_input_buffer()
|
|
# flush input buffer, discarding all its contents
|
|
ser.reset_output_buffer()
|
|
# flush output buffer, aborting current output
|
|
# and discard all that is in buffer
|
|
RequestCount = 0
|
|
print("Port Opening")
|
|
# Initialise RetryCounter
|
|
RetryCount = 0
|
|
# Initialise Variable to take remainder string
|
|
remainder_hex = b""
|
|
|
|
while True:
|
|
# Read from Serial Interface
|
|
response = ser.read(PackageByLength)
|
|
# print(response)
|
|
if len(response) > 0:
|
|
# In case there is something coming down the serial path
|
|
logging.debug(response)
|
|
|
|
if response != b"":
|
|
data = response
|
|
# debug line
|
|
# f.write(data)
|
|
# f.write("\n")
|
|
|
|
cdata = binascii.hexlify(data)
|
|
ddata = cdata.decode('utf-8')
|
|
ddata = ddata.upper()
|
|
print (ddata)
|
|
edata = hexspace(ddata, 2)
|
|
print (edata)
|
|
|
|
|
|
|
|
# points1 = ""
|
|
# points2 = ""
|
|
# quarter = ""
|
|
# data_str = response.decode(
|
|
# "ascii", errors="ignore"
|
|
# ).replace("\r", "|")
|
|
# if len(data_str) == 53:
|
|
# pattern = r"^(3 0|7 |8 |69i553 |69i557 |69i558 |5:i553 )(.{4})"
|
|
# matches = re.findall(pattern, data_str)
|
|
# for match in matches:
|
|
# found_value = match[0]
|
|
# timer_str = match[1]
|
|
# if match[0] == "3 0":
|
|
# points1 = data_str[7:10].strip()
|
|
# points2 = data_str[10:13].strip()
|
|
# quarter = data_str[13:14].strip()
|
|
|
|
# # print(f"Следующие 4 символа: {timer_str}, Найдено: {found_value}, {data_str}_____")
|
|
# else:
|
|
# pattern = r"(\|3 0|\|7 |\|8 |\|69i553 |\|69i557 |\|69i558 |\|5:i553 )(.{4})"
|
|
# matches = re.findall(pattern, data_str)
|
|
# # print(data_str)
|
|
# for match in matches:
|
|
# found_value = match[0]
|
|
# timer_str = match[1]
|
|
# if match[0] == "3 0":
|
|
# points1 = data_str[7:10].strip()
|
|
# points2 = data_str[10:13].strip()
|
|
# quarter = data_str[13:14].strip()
|
|
|
|
# # print(f"Следующие 4 символа: {timer_str}, Найдено: {found_value}, {data_str}_____")
|
|
# pattern_attack = r"(.{5})\|"
|
|
# matches_attack = re.findall(pattern_attack, data_str)
|
|
# path_pic = r"D:\ГРАФИКА\БАСКЕТБОЛ\ЕДИНАЯ ЛИГА ВТБ 2022-2023\Scorebug Indicators"
|
|
# try:
|
|
# if matches_attack[0][2:] == "030":
|
|
# time_attackGFX = ""
|
|
# time_attac_pic = path_pic + "\\24Sec_empty.png"
|
|
# else:
|
|
# hex_dict = {
|
|
# "I": 9,
|
|
# "H": 8,
|
|
# "G": 7,
|
|
# "F": 6,
|
|
# "E": 5,
|
|
# "D": 4,
|
|
# "C": 3,
|
|
# "B": 2,
|
|
# "A": 1,
|
|
# }
|
|
# time_attackGFX = matches_attack[0][:2]
|
|
# if time_attackGFX[-1] in [
|
|
# "A",
|
|
# "B",
|
|
# "C",
|
|
# "D",
|
|
# "E",
|
|
# "F",
|
|
# "G",
|
|
# "H",
|
|
# "I",
|
|
# ]:
|
|
# first_character = time_attackGFX[0]
|
|
# second_character = time_attackGFX[1]
|
|
# time_attackGFX = str(
|
|
# int(first_character, 16)
|
|
# + hex_dict.get(second_character, 0) / 10.0
|
|
# )
|
|
# time_attac_pic = path_pic + "\\24Sec_Red.png"
|
|
# else:
|
|
# time_attac_pic = path_pic + "\\24Sec_Orange.png"
|
|
# except IndexError:
|
|
# pass
|
|
|
|
# if timer_str[0] == " ":
|
|
# if timer_str == " 000":
|
|
# timer = "0.0"
|
|
# else:
|
|
# minites = timer_str[:2]
|
|
# seconds = timer_str[2:]
|
|
# timer = f"{int(minites)}:{seconds}".strip()
|
|
# elif timer_str[-1] == " ":
|
|
# seconds = timer_str[:2]
|
|
# milliseconds = timer_str[2:]
|
|
# timer = f"{int(seconds)}.{milliseconds}".strip()
|
|
# else:
|
|
# minites = timer_str[:2]
|
|
# seconds = timer_str[2:]
|
|
# timer = f"{int(minites)}:{seconds}".strip()
|
|
|
|
# print(
|
|
# f"Следующие 4 символа: {timer_str}, {timer}, {time_attackGFX}, Найдено: {found_value}, {data_str}_____"
|
|
# )
|
|
|
|
# with open(PATH, "r", encoding="utf-8") as f:
|
|
# new_data = json.load(f)
|
|
# new_data = new_data[0]
|
|
# new_data["timeGFX"] = timer
|
|
# new_data["time_attackGFX"] = time_attackGFX
|
|
# new_data["time_attac_pic"] = time_attac_pic
|
|
# if points1:
|
|
# new_data["points1"] = points1
|
|
# new_data["points2"] = points2
|
|
# new_data["quarter"] = quarter
|
|
# try:
|
|
# with open(PATH, "w", encoding="utf-8") as file:
|
|
# json.dump(
|
|
# [new_data], file, ensure_ascii=False, indent=4
|
|
# )
|
|
# except Exception:
|
|
# pass
|
|
|
|
else:
|
|
# In case nothing is coming down the serial interface
|
|
print(
|
|
"\rWaiting for serial input...",
|
|
end=" ",
|
|
flush=True,
|
|
)
|
|
|
|
# in case that the Serial Read or HTTP request fails
|
|
except Exception as e1:
|
|
print("error communicating...: " + str(e1))
|
|
logging.error("error communicating...: " + str(e1))
|
|
|
|
else:
|
|
print("Port Opening Failed... trying again in 5 seconds")
|
|
time.sleep(0.1)
|
|
ser.close()
|
|
|
|
except SerialException:
|
|
print("No port connected... trying again in 5 seconds")
|
|
time.sleep(0.1)
|