-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_Gpio.py
104 lines (83 loc) · 4.06 KB
/
test_Gpio.py
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
#!/usr/bin/env python
""" Testing Gpio write/notify
"""
import pytest
from msg import tiny_frame
from msg import proto_gpio_msg as pm
from helper import serial_port
class TestGpio:
REQUEST_COUNT = 10000
def setup_class(self):
self.reverse = False
self.counter = 0
self.patter_counter = 0
@staticmethod
def config_gpio(reverse: bool):
if reverse:
pm.GpioInterface.send_config_msg([
pm.GpioConfig(pm.GpioId.GPIO0, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO1, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO2, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO3, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO4, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO5, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO6, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO7, pm.GpioMode.INPUT_PULLDOWN),
])
else:
pm.GpioInterface.send_config_msg([
pm.GpioConfig(pm.GpioId.GPIO0, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO1, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO2, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO3, pm.GpioMode.INPUT_PULLDOWN),
pm.GpioConfig(pm.GpioId.GPIO4, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO5, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO6, pm.GpioMode.OUTPUT_PUSHPULL),
pm.GpioConfig(pm.GpioId.GPIO7, pm.GpioMode.OUTPUT_PUSHPULL),
])
def generate_pattern(self):
# Convert the number to its binary representation
binary = bin(self.patter_counter)[2:]
# Pad the binary representation with leading zeros if necessary
binary = binary.zfill(pm.GpioId.GPIO_CNT.value // 2)
# Create a list of booleans representing the bits
bool_list = [bit == '1' for bit in binary]
self.patter_counter += 1
if self.patter_counter > (pow(2, pm.GpioId.GPIO_CNT.value / 2) - 1):
self.patter_counter = 0
print("Send pattern ({}): {}".format(self.counter, bool_list))
return list(reversed(bool_list))
def send_pattern(self):
if self.counter == TestGpio.REQUEST_COUNT // 2:
self.config_gpio(True)
pattern = self.generate_pattern()
data = []
for gpio_id, mode in pm.GpioInterface.Config.items():
if mode == pm.GpioMode.OUTPUT_PUSHPULL or \
mode == pm.GpioMode.OUTPUT_OPENDRAIN:
data.append(pm.OutputData(gpio_id, pattern[0]))
pattern = pattern[1:]
pm.GpioInterface.send_data_msg(data)
self.counter += 1
def verify_pattern(self):
if pm.GpioInterface.InputData[pm.GpioId.GPIO0] == pm.GpioInterface.InputData[pm.GpioId.GPIO4] and \
pm.GpioInterface.InputData[pm.GpioId.GPIO1] == pm.GpioInterface.InputData[pm.GpioId.GPIO5] and \
pm.GpioInterface.InputData[pm.GpioId.GPIO2] == pm.GpioInterface.InputData[pm.GpioId.GPIO6] and \
pm.GpioInterface.InputData[pm.GpioId.GPIO3] == pm.GpioInterface.InputData[pm.GpioId.GPIO7]:
return
pytest.fail("Gpio pattern mismatch (count: %d, data: %s)" % (self.counter, pm.GpioInterface.InputData.values()))
def test_gpio_write_notify(self, serial_port):
tf = tiny_frame.tf_init(serial_port.write)
TestGpio.config_gpio(False)
self.send_pattern()
while True:
if serial_port.in_waiting > 0:
# Read the incoming data
rx_data = serial_port.read(serial_port.in_waiting)
tf.accept(rx_data)
if pm.GpioInterface.Synchronized:
self.verify_pattern()
if self.counter < TestGpio.REQUEST_COUNT:
self.send_pattern()
else:
break