-
Notifications
You must be signed in to change notification settings - Fork 348
Expand file tree
/
Copy pathtest_pdo.py
More file actions
95 lines (79 loc) · 3.55 KB
/
test_pdo.py
File metadata and controls
95 lines (79 loc) · 3.55 KB
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
import unittest
import canopen
from .util import SAMPLE_EDS, tmp_file
class TestPDO(unittest.TestCase):
def setUp(self):
node = canopen.Node(1, SAMPLE_EDS)
pdo = node.pdo.tx[1]
pdo.add_variable('INTEGER16 value') # 0x2001
pdo.add_variable('UNSIGNED8 value', length=4) # 0x2002
pdo.add_variable('INTEGER8 value', length=4) # 0x2003
pdo.add_variable('INTEGER32 value') # 0x2004
pdo.add_variable('BOOLEAN value', length=1) # 0x2005
pdo.add_variable('BOOLEAN value 2', length=1) # 0x2006
# Write some values
pdo['INTEGER16 value'].raw = -3
pdo['UNSIGNED8 value'].raw = 0xf
pdo['INTEGER8 value'].raw = -2
pdo['INTEGER32 value'].raw = 0x01020304
pdo['BOOLEAN value'].raw = False
pdo['BOOLEAN value 2'].raw = True
self.pdo = pdo
self.node = node
def test_pdo_map_bit_mapping(self):
self.assertEqual(self.pdo.data, b'\xfd\xff\xef\x04\x03\x02\x01\x02')
def test_pdo_map_getitem(self):
pdo = self.pdo
self.assertEqual(pdo['INTEGER16 value'].raw, -3)
self.assertEqual(pdo['UNSIGNED8 value'].raw, 0xf)
self.assertEqual(pdo['INTEGER8 value'].raw, -2)
self.assertEqual(pdo['INTEGER32 value'].raw, 0x01020304)
self.assertEqual(pdo['BOOLEAN value'].raw, False)
self.assertEqual(pdo['BOOLEAN value 2'].raw, True)
def test_pdo_getitem(self):
node = self.node
self.assertEqual(node.tpdo[1]['INTEGER16 value'].raw, -3)
self.assertEqual(node.tpdo[1]['UNSIGNED8 value'].raw, 0xf)
self.assertEqual(node.tpdo[1]['INTEGER8 value'].raw, -2)
self.assertEqual(node.tpdo[1]['INTEGER32 value'].raw, 0x01020304)
self.assertEqual(node.tpdo['INTEGER32 value'].raw, 0x01020304)
self.assertEqual(node.tpdo[1]['BOOLEAN value'].raw, False)
self.assertEqual(node.tpdo[1]['BOOLEAN value 2'].raw, True)
# Test different types of access
self.assertEqual(node.pdo[0x1600]['INTEGER16 value'].raw, -3)
self.assertEqual(node.pdo['INTEGER16 value'].raw, -3)
self.assertEqual(node.pdo.tx[1]['INTEGER16 value'].raw, -3)
self.assertEqual(node.pdo[0x2001].raw, -3)
self.assertEqual(node.tpdo[0x2001].raw, -3)
self.assertEqual(node.pdo[0x2002].raw, 0xf)
self.assertEqual(node.pdo['0x2002'].raw, 0xf)
self.assertEqual(node.tpdo[0x2002].raw, 0xf)
self.assertEqual(node.pdo[0x1600][0x2002].raw, 0xf)
def test_pdo_save(self):
self.node.tpdo.save()
self.node.rpdo.save()
def test_pdo_export(self):
try:
import canmatrix
except ImportError:
raise unittest.SkipTest("The PDO export API requires canmatrix")
for pdo in "tpdo", "rpdo":
with tmp_file(suffix=".csv") as tmp:
fn = tmp.name
with self.subTest(filename=fn, pdo=pdo):
getattr(self.node, pdo).export(fn)
with open(fn) as csv:
header = csv.readline()
self.assertIn("ID", header)
self.assertIn("Frame Name", header)
def test_tpdo_start_stop(self):
network = canopen.Network()
network.connect("test", interface="virtual")
self.node.associate_network(network)
self.node.tpdo[1].start(period=0.01)
self.node.tpdo[1].stop()
def test_rpdo_subscribe_unsubscribe(self):
self.node.rpdo.subscribe()
self.node.rpdo.unsubscribe()
if __name__ == "__main__":
unittest.main()