Upload files to ''

functions implemented to call from REST, also leading 0's and full tests implemented for StartUp and OnlineTest. 
If OnlineTest = false, StartUp get called. If StartUp = true the last generated number which failed OnlineTest will be used to not manipulate the RNG with the tests.
main
Orell-Pieter Schwarzbach 2023-05-22 14:46:28 +02:00
parent de36cc0f25
commit 511e3916b5
1 changed files with 157 additions and 0 deletions

View File

@ -0,0 +1,157 @@
import os
import time
from smbus import SMBus
from StartUpTest import StartUPTest
from TotOnline import TotOnline
def read_data(num_numbers, bits_per_number):
addr = 0x8
bus = SMBus(1)
# Calculate the total number of bytes required to accommodate the desired number of bits
total_bytes = (num_numbers * bits_per_number + 7) // 8
# Define the filename
filename = f'{num_numbers}numbers_{bits_per_number}bits'
start_time = time.time() # start time of read
with open(filename + '.bin', 'wb') as file:
bytes_received = 0
while bytes_received < total_bytes:
# Read a byte from the serial port
data = bus.read_byte(addr)
file.write(bytes([data]))
bytes_received += 1
time.sleep(0.0000001)
end_time = time.time() # end time of read
elapsed_time = end_time - start_time
seconds = int(elapsed_time)
milliseconds = int((elapsed_time % 1) * 1000)
new_filename = f"{filename}_TimeInSeconds_{seconds}_{milliseconds}.bin" # filename in format filename_seconds_milliseconds as txt with needed time to finish read
os.rename(filename + '.bin', new_filename) # change filename to new filename
return new_filename
def convert_to_hex(binary_filename, num_numbers, bits_per_number):
with open(binary_filename, 'r') as f:
# Read the contents of the file
binary_content = f.read()
# Calculate the number of bits per chunk
bits_per_chunk = len(binary_content) // num_numbers
# Divide the binary content into equal chunks
binary_chunks = [binary_content[i * bits_per_chunk:(i + 1) * bits_per_chunk] for i in range(num_numbers)]
# Calculate the number of hexadecimal digits per chunk
hex_digits_per_chunk = (bits_per_chunk + 3) // 4 # Round up to the nearest integer
# Convert each binary chunk to a hexadecimal string with leading zeros
hex_chunks = [format(int(chunk, 2), f'0{hex_digits_per_chunk}X') for chunk in binary_chunks]
# Write the hex chunks to the file with separators and newlines
hex_filename = f'{num_numbers}numbers_{bits_per_number}bits.txt'
with open(hex_filename, 'w') as f:
for i in range(num_numbers):
hex_number = hex_chunks[i]
# write the separator between numbers except for the last one
if i != num_numbers - 1:
hex_number += ';'
f.write(hex_number)
return hex_filename
def convert_to_binary(filename, num_numbers, bits_per_number):
with open(filename, 'rb') as f:
# Read the contents of the file as bytes
content = f.read()
# Convert the bytes to a string of binary digits
binary_str = ''.join(format(byte, '08b') for byte in content)
# Truncate the binary string to the desired length
truncated_binary_str = binary_str[:num_numbers * bits_per_number]
# Write the truncated binary string back to the file with separators
binary_filename = f'{num_numbers}numbers_{bits_per_number}bits_binary.txt'
with open(binary_filename, 'w') as f:
for i in range(0, len(truncated_binary_str), bits_per_number):
binary_number = truncated_binary_str[i:i+bits_per_number]
f.write(binary_number + '')
return binary_filename
def process_data_in_chunks(data, chunk_size=1000000):
chunks = [data[i:i+chunk_size] for i in range(0, len(data), chunk_size)]
return chunks
def perform_startup_tests(filename):
with open(filename, 'rb') as f:
# Read the contents of the file as bytes
content = f.read()
print("Run all StartUPTests")
binary_chunks = process_data_in_chunks(content)
first_chunk = binary_chunks[0]
result = StartUPTest.run_all_tests(first_chunk)
print(result)
return result
def perform_tot_online_tests(filename):
with open(filename, 'rb') as f:
# Read the contents of the file as bytes
content = f.read()
print("Run all TotOnline tests")
binary_chunks = process_data_in_chunks(content)
first_chunk = binary_chunks[0]
result = TotOnline.run_all_tests(first_chunk)
print(result)
return result
def analyze_data(num_numbers, bits_per_number, startup=False):
if startup:
filename = read_data(10, 80000)
binary_filename = convert_to_binary(filename, 10, 80000)
perform_startup_tests(binary_filename)
perform_tot_online_tests(binary_filename)
os.unlink(filename)
os.unlink(binary_filename)
else:
filename = read_data(num_numbers, bits_per_number)
binary_filename = convert_to_binary(filename, num_numbers, bits_per_number)
hex_filename = convert_to_hex(binary_filename, num_numbers, bits_per_number)
result = perform_tot_online_tests(binary_filename)
with open(hex_filename, 'rb') as f:
# Read the contents of the file as bytes
hex_return = f.read()
print(hex_return)
os.unlink(filename)
os.unlink(hex_filename)
os.unlink(binary_filename)
if result:
return hex_return
else:
filename = read_data(10, 80000)
binary_filename = convert_to_binary(filename, 10, 80000)
SUTres = perform_startup_tests(binary_filename)
TOTres = perform_tot_online_tests(binary_filename)
if SUTres and TOTres:
os.unlink(filename)
os.unlink(binary_filename)
return hex_return
else:
return False
# Teste den Code
result = analyze_data(8, 10003, startup=False)
print(result)