1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
from test.helpers.syscmd import SysCommand
from test.helpers.globalVariables import globalVar
import binascii
import uuid
import subprocess
from PIL import Image, ImageDraw, ImageFont
import qrcode
import PIL
class Finisher(object):
__muhb = None
__final_to_burn_to_eeprom = None
__qr_image = None
def __init__(self, muhb = None):
self.__muhb = muhb
self.__final_to_burn_to_eeprom = bytearray()
self.__qr_image = None
pass
def eeprom_burn(self):
## Create binary file
str_cmd2 = "find /sys/ -iname 'eeprom'"
eeprom_location = SysCommand("eeprom_location", str_cmd2)
if eeprom_location.execute() == 0:
raw_out = eeprom_location.getOutput()
if raw_out == "":
self.fail("Unable to get EEPROM location. IS EEPROM CONNECTED?")
eeprom = raw_out.decode('ascii')
eeprom = eeprom.strip('\n')
## push binary data to eeprom like if working with files
file2 = open(eeprom, "w+b")
file2.write(self.__final_to_burn_to_eeprom)
else:
self.fail("failed: could not complete find eeprom command")
def generate_qr_stamp(self):
# Generate QR to put in a stamp
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
# Use board_uuid to generate the QR code
qr.add_data(globalVar.g_uuid)
qr.make(fit=True)
# Save QR as image stamp.png
img = qr.make_image()
# Store QR as a class atrib
self.__qr_image = img
img.save('/home/root/stamp.png')
def print_stamp(self):
# Print stamp by sending a cmd to the printer
str_cmd3 = "lpr -o scaling=4 stamp.png".format(self.__display)
printstamp = SysCommand("printstamp", str_cmd3)
if printstamp.execute() != 0:
self.fail("failed: could not print stamp")
def generate_screen(self):
# Generate green image with board uuid and QR maybe pasted on top of green image
# Define image size
W = 1250
H = 703
# Create blank rectangle to write on
image = Image.new('RGB', (W, H), (46, 204, 113, 0))
draw = ImageDraw.Draw(image)
message = "TEST OK\n\n" + "Board UUID: "+ globalVar.g_uuid
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavuu/DejaVuSans.ttf', 40)
# Calculate the width and height of the text to be drawn, given font size
w, h = draw.textsize(message, font=font)
# Write the text to the image, where (x,y) is the top left corner of the text
draw.text(((W-w)/2,(H-h)/2), message, align='center', font=font)
#draw.image(self.__qr_image)
image.save('/home/root/test/files/test_ok.png')
def show_result_screen(self):
# If test OK show test_OK.png located in /home/root, If test fail show test_fail.png, located in /home/root/test/files/test_KO.png
if globalVar.fstatus:
str_cmd4 = "fbi -T 1 --noverbose -d /dev/{} test/files/test_ok.png".format('fb0')
else:
str_cmd4 = "fbi -T 1 --noverbose -d /dev/{} test/files/test_ko.png".format('fb0')
display_image = SysCommand("display_image", str_cmd4)
#print(display_image.execute())
if display_image.execute() != -1:
self.fail("failed: could not display the image")
def end_ok(self):
# Burn retrieved igep eeprom struct
new = self.__muhb[0][0]
# Convert from string to hex
hnew = new.encode()
# Magic_id and default crc32 0x6d, 0x6a, 0x6d, 0xe4 with endianess changed so that u-boot loads it correctly
# IF magic ever changes this magic_id should be changed. At the end always magic_id of test and u-boot should
# be the same
magic_id = bytes([0xe4, 0x6d, 0x6a, 0x6d])
default_igep_crc32 = bytes([0x00, 0x00, 0x00, 0x00])
# Create bytearray
to_calculate = bytearray()
# Build the final hex binary for crc32 operation
to_calculate.extend(magic_id)
to_calculate.extend(default_igep_crc32)
to_calculate.extend(hnew)
# Calculate crc32!
new_crc32 = binascii.crc32(to_calculate)
hnew_crc32 = new_crc32.to_bytes(4, byteorder="little")
# Recreate final eeprom struct in bytearray
self.__final_to_burn_to_eeprom = bytearray()
self.__final_to_burn_to_eeprom.extend(magic_id)
self.__final_to_burn_to_eeprom.extend(hnew_crc32)
self.__final_to_burn_to_eeprom.extend(hnew)
self.eeprom_burn()
# Generate QR stamp
self.generate_qr_stamp()
# Send print stamp command
#self.print_stamp()
# Generate green image with board uuid and QR maybe pasted on top of green image
self.generate_screen()
# Show test_ok.png image in screen
self.show_result_screen()
def end_fail(self):
# Burn igep eeprom bug struct
hnew = self.__muhb.encode()
default_fail = bytes([0xD0, 0xBA, 0xD0, 0xBA])
self.__final_burn_to_eeprom = bytearray()
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(hnew)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.__final_to_burn_to_eeprom.extend(default_fail)
self.eeprom_burn()
# Show test_ko.png image in screen
self.show_result_screen()
|