Skip to content

Commit ae3b2a4

Browse files
sander-vissercogu
authored andcommitted
Update generator to create a slightly more efficient switch for callback functions
Prepared for 0.3.3 version
1 parent 9a4234d commit ae3b2a4

File tree

10 files changed

+273
-188
lines changed

10 files changed

+273
-188
lines changed

apx/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.3.2"
1+
__version__ = "0.3.3"
22
from apx.base import *
33
from apx.vm_base import *
44
from apx.node import *

apx/generator.py

+170-144
Large diffs are not rendered by default.

doc/conf.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
# The short X.Y version.
6161
version = '0.3'
6262
# The full version, including alpha/beta/rc tags.
63-
release = 'v0.3.2'
63+
release = 'v0.3.3'
6464

6565
# The language for content autogenerated by Sphinx. Refer to documentation
6666
# for a list of supported languages.

examples/generator/example_node1.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def create_autosar_workspace():
3232
autosar.DataElement('VehicleSpeed', 'VehicleSpeed_T'))
3333
components = ws.createPackage('ComponentType', role='ComponentType')
3434
swc = components.createApplicationSoftwareComponent('Example1')
35-
swc.createRequirePort('EngineRunningStatus', 'EngineRunningStatus_I', initValueRef=constants['C_EngineRunningStatus_IV'].ref)
35+
swc.createRequirePort('EngineRunningStatus', 'EngineRunningStatus_I', initValueRef=constants['C_EngineRunningStatus_IV'].ref)
3636
swc.createRequirePort('VehicleSpeed', 'VehicleSpeed_I', initValueRef=constants['C_VehicleSpeed_IV'].ref)
3737
swc.createProvidePort('FuelLevelPercent', 'FuelLevelPercent_I', initValueRef=constants['C_FuelLevelPercent_IV'].ref)
3838
swc.behavior.createRunnable(swc.name+'_Init', portAccess=[x.name for x in swc.providePorts])
@@ -57,7 +57,7 @@ def create_apx_context(ws):
5757
node = apx.Node().import_autosar_swc(swc)
5858
context.append(node)
5959
return context
60-
60+
6161
def generate_apx_node(context, derived_dir):
6262
node_generator = apx.NodeGenerator()
6363
for node in context.nodes:

setup.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ def readme():
99
def test_suite():
1010
loader = unittest.TestLoader()
1111
suite = loader.loadTestsFromModule(test_module)
12-
return suite
12+
return suite
1313

1414
setup(name='apx',
15-
version='0.3.2',
15+
version='0.3.3',
1616
description='Official APX python toolchain and client',
1717
long_description=readme(),
1818
classifiers=[

tests/apx_file_test.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ def __init__(self):
1616
def inPortDataWriteNotify(self, file, offset: int, length: int):
1717
"""
1818
Called by FileManager when it receives a remote write in the node's inPortData file
19-
"""
19+
"""
2020
self.calls.append(FileWrite(file, offset, length))
2121

2222
class MockFileManager:
2323
def __init__(self):
2424
self.calls=[]
25-
25+
2626
def outPortDataWriteNotify(self, file, offset : int, length : int):
2727
self.calls.append(FileWrite(file, offset, length))
28-
28+
2929

3030
class TestApxFile(unittest.TestCase):
31-
31+
3232
def test_input_file(self):
3333
mockDataHandler = MockNodeDataHandler()
3434
inFile = apx.InputFile('test1.in', 10)

tests/expected_gen/ApxNode_Test.c

+41-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <string.h>
55
#include <stdio.h>
66
#include "ApxNode_Test.h"
7+
#include "ApxNode_Test_Cbk.h"
78
#include "pack.h"
89

910
//////////////////////////////////////////////////////////////////////////////
@@ -12,10 +13,24 @@
1213
#define APX_DEFINITON_LEN 299u
1314
#define APX_IN_PORT_DATA_LEN 17u
1415
#define APX_OUT_PORT_DATA_LEN 14u
16+
17+
#define APX_RX_LEN_RU8PORT 1u
18+
#define APX_RX_LEN_RU8ARPORT 3u
19+
#define APX_RX_LEN_SOUNDREQUEST 3u
20+
#define APX_RX_LEN_RS32PORT 4u
21+
#define APX_RX_LEN_RS16ARPORT 6u
22+
23+
#define APX_RX_OFFSET_RS16ARPORT 0u
24+
#define APX_RX_OFFSET_RS32PORT 6u
25+
#define APX_RX_OFFSET_RU8ARPORT 10u
26+
#define APX_RX_OFFSET_RU8PORT 13u
27+
#define APX_RX_OFFSET_SOUNDREQUEST 14u
28+
1529
//////////////////////////////////////////////////////////////////////////////
1630
// LOCAL FUNCTIONS
1731
//////////////////////////////////////////////////////////////////////////////
1832
static void outPortData_writeCmd(apx_offset_t offset, apx_size_t len );
33+
1934
//////////////////////////////////////////////////////////////////////////////
2035
// LOCAL VARIABLES
2136
//////////////////////////////////////////////////////////////////////////////
@@ -172,17 +187,40 @@ Std_ReturnType ApxNode_Write_Test_PU32Port(uint32 val)
172187

173188
void Test_inPortDataWritten(void *arg, apx_nodeData_t *nodeData, uint32_t offset, uint32_t len)
174189
{
190+
union data_tag
191+
{
192+
uint8 RU8Port;
193+
} data;
194+
uint32_t endOffset = offset + len;
195+
175196
(void)arg;
176197
(void)nodeData;
177-
(void)offset;
178-
(void)len;
198+
199+
if (offset < APX_RX_OFFSET_RU8PORT)
200+
{
201+
offset = APX_RX_OFFSET_RU8PORT;
202+
}
203+
while (offset < endOffset)
204+
{
205+
switch(offset)
206+
{
207+
case APX_RX_OFFSET_RU8PORT:
208+
(void) ApxNode_Read_Test_RU8Port(&data.RU8Port);
209+
RU8Port_cb_func(data.RU8Port);
210+
offset += APX_RX_LEN_RU8PORT;
211+
break;
212+
//case APX_RX_OFFSET_SOUNDREQUEST:
213+
default:
214+
offset = endOffset;
215+
}
216+
}
179217
}
180218
//////////////////////////////////////////////////////////////////////////////
181219
// LOCAL FUNCTIONS
182220
//////////////////////////////////////////////////////////////////////////////
183221
static void outPortData_writeCmd(apx_offset_t offset, apx_size_t len )
184222
{
185-
if ( (m_outPortDirtyFlags[offset] == 0) && (true == apx_nodeData_isOutPortDataOpen(&m_nodeData) ) )
223+
if ( (m_outPortDirtyFlags[offset] == 0) && apx_nodeData_isOutPortDataOpen(&m_nodeData) )
186224
{
187225
m_outPortDirtyFlags[offset] = (uint8_t) 1u;
188226
apx_nodeData_unlockOutPortData(&m_nodeData);

tests/expected_gen/ApxNode_Test_Cbk.h

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef APXNODE_TEST_CBK_H
2+
#define APXNODE_TEST_CBK_H
3+
4+
//////////////////////////////////////////////////////////////////////////////
5+
// INCLUDES
6+
//////////////////////////////////////////////////////////////////////////////
7+
#include "Rte_Type.h"
8+
9+
//////////////////////////////////////////////////////////////////////////////
10+
// FUNCTION PROTOTYPES
11+
//////////////////////////////////////////////////////////////////////////////
12+
void RU8Port_cb_func(uint8 value);
13+
14+
#endif //APXNODE_TEST_CBK_H

tests/generator_test.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ def test_code_generator(self):
3434
node.append(apx.ProvidePort('PU16ARPort','S[4]','={65535, 65535, 65535, 65535}'))
3535
node.append(apx.ProvidePort('PU32Port','L','=4294967295'))
3636

37+
callback_map = { 'RU8Port': 'RU8Port_cb_func' }
38+
3739
output_dir = 'derived'
3840
output_dir_full = os.path.join(os.path.dirname(__file__),output_dir)
3941
if not os.path.exists(output_dir_full):
4042
os.makedirs(output_dir_full)
4143
time.sleep(0.1)
42-
apx.NodeGenerator().generate(output_dir_full, node)
44+
apx.NodeGenerator().generate(output_dir_full, node, callbacks=callback_map)
4345
with open (os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}.h'.format(node)), "r") as fp:
4446
generated=fp.read()
4547
with open (os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.h'.format(node)), "r") as fp:
@@ -50,6 +52,11 @@ def test_code_generator(self):
5052
with open (os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}.c'.format(node)), "r") as fp:
5153
expected=fp.read()
5254
self.assertEqual(expected, generated)
55+
with open (os.path.join(os.path.dirname(__file__), output_dir, 'ApxNode_{0.name}_Cbk.h'.format(node)), "r") as fp:
56+
generated=fp.read()
57+
with open (os.path.join(os.path.dirname(__file__), 'expected_gen', 'ApxNode_{0.name}_Cbk.h'.format(node)), "r") as fp:
58+
expected=fp.read()
59+
self.assertEqual(expected, generated)
5360
shutil.rmtree(output_dir_full)
5461

5562
if __name__ == '__main__':

tests/node_data_test.py

+30-30
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_port_map_and_compiled_programs(self):
3434
for i in range(9, 27):
3535
self.assertEqual(node_data.inPortByteMap[i].name, 'RecordSignal')
3636
self.assertEqual(node_data.inPortByteMap[i].id, 2)
37-
37+
3838
self.assertEqual(len(node_data.outPortDataMap), 4)
3939
elem = node_data.outPortDataMap[0]
4040
self.assertEqual(elem.data_offset, 0)
@@ -57,11 +57,11 @@ def test_port_map_and_compiled_programs(self):
5757
apx.OPCODE_PACK_U16])
5858
self.assertEqual(node_data.outPortPrograms[0], expected)
5959
expected = bytes([apx.OPCODE_PACK_PROG, apx.UINT8_LEN,0,0,0,
60-
apx.OPCODE_PACK_U8])
60+
apx.OPCODE_PACK_U8])
6161
self.assertEqual(node_data.outPortPrograms[1], expected)
6262
expected = bytes([apx.OPCODE_PACK_PROG, apx.UINT32_LEN,0,0,0,
63-
apx.OPCODE_PACK_U32])
64-
self.assertEqual(node_data.outPortPrograms[2], expected)
63+
apx.OPCODE_PACK_U32])
64+
self.assertEqual(node_data.outPortPrograms[2], expected)
6565
expected = bytes([apx.OPCODE_PACK_PROG, (3*apx.UINT16_LEN+apx.UINT32_LEN),0,0,0,
6666
apx.OPCODE_RECORD_ENTER,
6767
apx.OPCODE_RECORD_SELECT])+"SensorData\0".encode('ascii')+bytes([
@@ -75,10 +75,10 @@ def test_port_map_and_compiled_programs(self):
7575
apx.OPCODE_RECORD_LEAVE,
7676
apx.OPCODE_RECORD_SELECT])+"TimeStamp\0".encode('ascii')+bytes([
7777
apx.OPCODE_PACK_U32,
78-
apx.OPCODE_RECORD_LEAVE
78+
apx.OPCODE_RECORD_LEAVE
7979
])
80-
self.assertEqual(node_data.outPortPrograms[3], expected)
81-
80+
self.assertEqual(node_data.outPortPrograms[3], expected)
81+
8282
expected = bytes([apx.OPCODE_UNPACK_PROG, apx.UINT8_LEN,0,0,0,
8383
apx.OPCODE_UNPACK_U8])
8484
self.assertEqual(node_data.inPortPrograms[0], expected)
@@ -100,7 +100,7 @@ def test_port_map_and_compiled_programs(self):
100100

101101

102102
class TestNodeDataRead(unittest.TestCase):
103-
103+
104104
def test_read_port_RheostatLevelRqst(self):
105105
node = create_node_and_data()
106106
port_RheostatLevelRqst = node.find('RheostatLevelRqst')
@@ -153,7 +153,7 @@ def test_read_RecordSignal(self):
153153
self.assertEqual(node_data.read_require_port(port_RecordSignal), {'Name': "abcdefgh", 'Id':0x12345678, 'Data': [0,0,1]})
154154
input_file.write(data_offset, struct.pack("<HHH",18000,2,10))
155155
self.assertEqual(node_data.read_require_port(port_RecordSignal), {'Name': "abcdefgh", 'Id':0x12345678, 'Data': [18000,2,10]})
156-
156+
157157
def test_byte_to_port_all(self):
158158
node = create_node_and_data()
159159
node_data = apx.NodeData(node)
@@ -179,11 +179,11 @@ def test_byte_to_port_all(self):
179179
self.assertEqual(result[0][2], RheostatLevelRqst_data_len)
180180
self.assertEqual(result[1][2], StrSignal_data_len)
181181
self.assertEqual(result[2][2], RecordSignal_data_len)
182-
182+
183183
def test_byte_to_port_RheostatLevelRqst(self):
184184
node = create_node_and_data()
185185
node_data = apx.NodeData(node)
186-
186+
187187
RheostatLevelRqst_data_offset = 0
188188
RheostatLevelRqst_data_len = 1
189189
result = list(node_data.byte_to_port(RheostatLevelRqst_data_offset, RheostatLevelRqst_data_len))
@@ -196,7 +196,7 @@ def test_byte_to_port_RheostatLevelRqst(self):
196196
def test_byte_to_port_StrSignal(self):
197197
node = create_node_and_data()
198198
node_data = apx.NodeData(node)
199-
199+
200200
StrSignal_data_offset = 1
201201
StrSignal_data_len = 8
202202
for offset in range(StrSignal_data_offset, StrSignal_data_offset+StrSignal_data_len):
@@ -210,7 +210,7 @@ def test_byte_to_port_StrSignal(self):
210210
def test_byte_to_port_RecordSignal(self):
211211
node = create_node_and_data()
212212
node_data = apx.NodeData(node)
213-
213+
214214
RecordSignal_data_offset = 9
215215
RecordSignal_data_len = 18
216216
for offset in range(RecordSignal_data_offset, RecordSignal_data_offset+RecordSignal_data_len):
@@ -220,20 +220,20 @@ def test_byte_to_port_RecordSignal(self):
220220
self.assertIs(port, node.find('RecordSignal'))
221221
self.assertEqual(offset, RecordSignal_data_offset)
222222
self.assertEqual(length, RecordSignal_data_len)
223-
223+
224224
def test_byte_to_port_invalid_args(self):
225225
node = create_node_and_data()
226226
node_data = apx.NodeData(node)
227227
self.assertEqual(len(node_data.inPortByteMap), 27)
228-
228+
229229
with self.assertRaises(ValueError) as context:
230230
result = list(node_data.byte_to_port(28,1))
231231
self.assertEqual(str(context.exception), "start_offset (28) is beyond length of file (27)")
232-
232+
233233
with self.assertRaises(ValueError) as context:
234234
result = list(node_data.byte_to_port(25,5))
235235
self.assertEqual(str(context.exception), "end_offset (30) is beyond length of file (27)")
236-
236+
237237
RecordSignal_data_offset = 9
238238
RecordSignal_data_len = 18
239239
result = list(node_data.byte_to_port(25,2))
@@ -243,14 +243,14 @@ def test_byte_to_port_invalid_args(self):
243243
self.assertEqual(length, RecordSignal_data_len)
244244

245245
def test_callback(self):
246-
246+
247247
call_history = []
248-
248+
249249
@apx.NodeDataClient.register
250250
class Listener:
251251
def on_require_port_data(self, port, value):
252252
call_history.append((port, value))
253-
253+
254254
listener_obj = Listener()
255255
node = create_node_and_data()
256256
node_data = apx.NodeData(node)
@@ -273,7 +273,7 @@ def on_require_port_data(self, port, value):
273273
self.assertEqual(len(call_history), 2)
274274
self.assertEqual(call_history[-1][0], node.find('RheostatLevelRqst'))
275275
self.assertEqual(call_history[-1][1], 255)
276-
276+
277277
#test write RecordSignal
278278
input_file.write(RecordSignal_data_offset, "Test".encode('utf-8'))
279279
self.assertEqual(len(call_history), 3)
@@ -285,7 +285,7 @@ def on_require_port_data(self, port, value):
285285
self.assertEqual(call_history[-1][1], {'Name': "Abc", 'Id': 918, 'Data':[1000,2000,4000]})
286286

287287
class TestNodeDataWrite(unittest.TestCase):
288-
288+
289289
def test_write_VehicleSpeed(self):
290290
node = create_node_and_data()
291291
node_data = apx.NodeData(node)
@@ -295,9 +295,9 @@ def test_write_VehicleSpeed(self):
295295
output_file = node_data.outPortDataFile
296296
#verify init value
297297
self.assertEqual(output_file.read(VehicleSpeed_offset, VehicleSpeed_length), bytes([0xFF, 0xFF]))
298-
node_data.write_provide_port(VehicleSpeed_port, 0x1234)
298+
node_data.write_provide_port(VehicleSpeed_port, 0x1234)
299299
self.assertEqual(output_file.read(VehicleSpeed_offset, VehicleSpeed_length), bytes([0x34, 0x12]))
300-
300+
301301
def test_write_MainBeam(self):
302302
node = create_node_and_data()
303303
node_data = apx.NodeData(node)
@@ -311,7 +311,7 @@ def test_write_MainBeam(self):
311311
self.assertEqual(output_file.read(MainBeam_offset, MainBeam_length), bytes([0]))
312312
node_data.write_provide_port(MainBeam_port, 3)
313313
self.assertEqual(output_file.read(MainBeam_offset, MainBeam_length), bytes([3]))
314-
314+
315315
def test_write_TotalDistance(self):
316316
node = create_node_and_data()
317317
node_data = apx.NodeData(node)
@@ -338,7 +338,7 @@ def test_write_ComplexRecordSignal(self):
338338
#write some values
339339
node_data.write_provide_port(ComplexRecordSignal_port, {"SensorData": dict(x = 1, y =2, z= 3), 'TimeStamp':0})
340340
self.assertEqual(output_file.read(ComplexRecordSignal_offset, ComplexRecordSignal_length), struct.pack("<HHHL", 1, 2, 3, 0))
341-
341+
342342
def test_write_string(self):
343343
node = apx.Node('TestNode')
344344
port = node.append(apx.ProvidePort('StrSignal', 'a[6]', '=""'))
@@ -374,7 +374,7 @@ def test_write_s8(self):
374374
self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<b', 127))
375375
node_data.write_provide_port(port, 0)
376376
self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<b', 0))
377-
377+
378378
def test_write_s16(self):
379379
node = apx.Node('TestNode')
380380
port = node.append(apx.ProvidePort('S16Signal', 's', '=0'))
@@ -411,7 +411,7 @@ def test_write_s32(self):
411411
node_data.write_provide_port(port, 2147483647)
412412
self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i',2147483647))
413413
node_data.write_provide_port(port, 0)
414-
self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i', 0))
415-
414+
self.assertEqual(output_file.read(signal_offset, signal_length), struct.pack('<i', 0))
415+
416416
if __name__ == '__main__':
417-
unittest.main()
417+
unittest.main()

0 commit comments

Comments
 (0)