@@ -2930,13 +2930,51 @@ def ref(self) -> PackageRef:
2930
2930
return None if ref_str is None else PackageRef (ref_str )
2931
2931
2932
2932
2933
+ class BehaviorSettings :
2934
+ """
2935
+ Enables users to customize settings in SwcInternalBehavior such as naming conventions.
2936
+ """
2937
+
2938
+ def __init__ (self ) -> None :
2939
+
2940
+ # Default prefix used for generating event names
2941
+ self .background_event_prefix : str | None = None # BackgroundEvent prefix
2942
+ self .data_receive_error_event_prefix : str | None = None # DataReceiveErrorEvent prefix
2943
+ self .data_receive_event_prefix : str | None = None # DataReceivedEvent prefix
2944
+ self .init_event_prefix : str | None = None # InitEvent prefix
2945
+ self .operation_invoked_event_prefix : str | None = None # OperationInvokedEvent prefix
2946
+ self .swc_mode_manager_error_event_prefix : str | None = None # SwcModeManagerErrorEvent prefix
2947
+ self .swc_mode_switch_event_prefix : str | None = None # SwcModeSwitchEvent prefix
2948
+ self .timing_event_prefix : str | None = None # TimingEvent prefix
2949
+
2950
+ def set_value (self , name : str , value : str ):
2951
+ """
2952
+ Updates a single value with error check
2953
+ """
2954
+ if hasattr (self , name ):
2955
+ if not isinstance (value , str ):
2956
+ raise TypeError (f"value: Expected string type. Got { str (type (value ))} " )
2957
+ setattr (self , name , value )
2958
+ else :
2959
+ raise KeyError (f"name: Invalid name '{ name } '" )
2960
+
2961
+ def update (self , value_map : dict [str , str ]):
2962
+ """
2963
+ Updates multiple values using keys in value_map, with error-check
2964
+ """
2965
+ for name , value in value_map .items ():
2966
+ self .set_value (name , value )
2967
+
2968
+
2933
2969
class PackageCollection :
2934
2970
"""
2935
2971
Base class that maintains a collection of AUTOSAR packages
2936
2972
"""
2937
2973
2938
- def __init__ (self , packages : list [Package ] | None = None ) -> None :
2974
+ def __init__ (self , packages : list [Package ] | None = None ,
2975
+ behavior_settings : BehaviorSettings | None = None ) -> None :
2939
2976
self .parent = None
2977
+ self .behavior_settings = behavior_settings
2940
2978
self .packages : list [Package ] = [] # .PACKAGES
2941
2979
self ._package_dict = {} # internal package map
2942
2980
if packages is not None :
@@ -6304,6 +6342,16 @@ def _get_valid_parent(self) -> SwComponentType:
6304
6342
raise RuntimeError ("Behavior object doesn't have a valid parent" )
6305
6343
return self .parent
6306
6344
6345
+ def _get_valid_behavior_settings (self ) -> BehaviorSettings :
6346
+ """
6347
+ Verifies that the root collection has a valid behavior_settings object and returns it
6348
+ """
6349
+ swc = self ._get_valid_parent ()
6350
+ workspace = swc .root_collection ()
6351
+ if not isinstance (workspace .behavior_settings , BehaviorSettings ):
6352
+ raise TypeError ("Root collection doesn't seem to be a valid workspace" )
6353
+ return workspace .behavior_settings
6354
+
6307
6355
def ref (self ) -> SwcInternalBehaviorRef | None :
6308
6356
"""
6309
6357
Returns a reference to this element or
@@ -6377,8 +6425,8 @@ def _make_unique_event_name(self, event_name: str) -> str:
6377
6425
return event_name
6378
6426
6379
6427
def create_background_event (self ,
6380
- event_name : str ,
6381
6428
runnable_name : str ,
6429
+ event_name : str | None = None ,
6382
6430
** kwargs
6383
6431
) -> BackgroundEvent :
6384
6432
"""
@@ -6387,15 +6435,24 @@ def create_background_event(self,
6387
6435
runnable = self .find_runnable (runnable_name )
6388
6436
if runnable is None :
6389
6437
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6438
+ if event_name is None :
6439
+ behavior_settings = self ._get_valid_behavior_settings ()
6440
+ if behavior_settings .background_event_prefix :
6441
+ event_name = behavior_settings .background_event_prefix + runnable_name
6442
+ else :
6443
+ msg = "event_name: Unable to dynamically create event name," \
6444
+ " background_event_prefix is not set in behavior settings"
6445
+ raise RuntimeError (msg )
6446
+ assert isinstance (event_name , str )
6390
6447
unique_event_name = self ._make_unique_event_name (event_name )
6391
6448
event = BackgroundEvent (unique_event_name , runnable .ref (), ** kwargs )
6392
6449
self .append_event (event )
6393
6450
return event
6394
6451
6395
6452
def create_data_receive_error_event (self ,
6396
- event_name : str ,
6397
6453
runnable_name : str ,
6398
6454
port_data_element : str ,
6455
+ event_name : str | None = None ,
6399
6456
** kwargs
6400
6457
) -> DataReceiveErrorEvent :
6401
6458
"""
@@ -6408,7 +6465,6 @@ def create_data_receive_error_event(self,
6408
6465
runnable = self .find_runnable (runnable_name )
6409
6466
if runnable is None :
6410
6467
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6411
- unique_event_name = self ._make_unique_event_name (event_name )
6412
6468
name_parts = split_ref_strict (port_data_element )
6413
6469
if len (name_parts ) == 1 :
6414
6470
port_name , data_element_name = name_parts [0 ], None
@@ -6421,6 +6477,18 @@ def create_data_receive_error_event(self,
6421
6477
if target_data_element is None :
6422
6478
msg = f"port_data_element: '{ port_data_element } ' does not name an existing data element in port interface"
6423
6479
raise ValueError (msg )
6480
+ if event_name is None :
6481
+ behavior_settings = self ._get_valid_behavior_settings ()
6482
+ if behavior_settings .data_receive_error_event_prefix :
6483
+ event_name = behavior_settings .data_receive_error_event_prefix + "_" .join ([runnable_name ,
6484
+ context_port .name ,
6485
+ target_data_element .name ])
6486
+ else :
6487
+ msg = "event_name: Unable to dynamically create event name," \
6488
+ " data_receive_error_event_prefix is not set in behavior settings"
6489
+ raise RuntimeError (msg )
6490
+ assert isinstance (event_name , str )
6491
+ unique_event_name = self ._make_unique_event_name (event_name )
6424
6492
event = DataReceiveErrorEvent .make (unique_event_name ,
6425
6493
runnable .ref (),
6426
6494
context_port .ref (),
@@ -6430,9 +6498,9 @@ def create_data_receive_error_event(self,
6430
6498
return event
6431
6499
6432
6500
def create_data_received_event (self ,
6433
- event_name : str ,
6434
6501
runnable_name : str ,
6435
6502
data_element_ref : str ,
6503
+ event_name : str | None = None ,
6436
6504
** kwargs
6437
6505
) -> DataReceivedEvent :
6438
6506
"""
@@ -6445,7 +6513,6 @@ def create_data_received_event(self,
6445
6513
runnable = self .find_runnable (runnable_name )
6446
6514
if runnable is None :
6447
6515
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6448
- unique_event_name = self ._make_unique_event_name (event_name )
6449
6516
name_parts = split_ref_strict (data_element_ref )
6450
6517
if len (name_parts ) == 1 :
6451
6518
port_name , data_element_name = name_parts [0 ], None
@@ -6458,6 +6525,18 @@ def create_data_received_event(self,
6458
6525
if target_data_element is None :
6459
6526
msg = f"data_element_ref: '{ data_element_ref } ' does not name an existing data element in port interface"
6460
6527
raise ValueError (msg )
6528
+ if event_name is None :
6529
+ behavior_settings = self ._get_valid_behavior_settings ()
6530
+ if behavior_settings .data_receive_event_prefix :
6531
+ event_name = behavior_settings .data_receive_event_prefix + "_" .join ([runnable_name ,
6532
+ context_port .name ,
6533
+ target_data_element .name ])
6534
+ else :
6535
+ msg = "event_name: Unable to dynamically create event name," \
6536
+ " data_receive_event_prefix is not set in behavior settings"
6537
+ raise RuntimeError (msg )
6538
+ assert isinstance (event_name , str )
6539
+ unique_event_name = self ._make_unique_event_name (event_name )
6461
6540
event = DataReceivedEvent .make (unique_event_name ,
6462
6541
runnable .ref (),
6463
6542
context_port .ref (),
@@ -6467,9 +6546,9 @@ def create_data_received_event(self,
6467
6546
return event
6468
6547
6469
6548
def create_data_send_completed_event (self ,
6470
- event_name : str ,
6471
6549
runnable_name : str ,
6472
6550
data_element_ref : str ,
6551
+ event_name : str | None = None ,
6473
6552
** kwargs
6474
6553
) -> DataSendCompletedEvent :
6475
6554
"""
@@ -6483,9 +6562,9 @@ def create_data_send_completed_event(self,
6483
6562
raise NotImplementedError ("References to data send points are not yet supported" )
6484
6563
6485
6564
def create_data_write_completed_event (self ,
6486
- event_name : str ,
6487
6565
runnable_name : str ,
6488
6566
data_element_ref : str ,
6567
+ event_name : str | None = None ,
6489
6568
** kwargs
6490
6569
) -> DataWriteCompletedEvent :
6491
6570
"""
@@ -6499,8 +6578,8 @@ def create_data_write_completed_event(self,
6499
6578
raise NotImplementedError ("References to data write access are not yet supported" )
6500
6579
6501
6580
def create_init_event (self ,
6502
- event_name : str ,
6503
6581
runnable_name : str ,
6582
+ event_name : str | None = None ,
6504
6583
** kwargs
6505
6584
) -> InitEvent :
6506
6585
"""
@@ -6509,15 +6588,24 @@ def create_init_event(self,
6509
6588
runnable = self .find_runnable (runnable_name )
6510
6589
if runnable is None :
6511
6590
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6591
+ if event_name is None :
6592
+ behavior_settings = self ._get_valid_behavior_settings ()
6593
+ if behavior_settings .init_event_prefix :
6594
+ event_name = behavior_settings .init_event_prefix + runnable_name
6595
+ else :
6596
+ msg = "event_name: Unable to dynamically create event name," \
6597
+ " init_event_prefix is not set in behavior settings"
6598
+ raise RuntimeError (msg )
6599
+ assert isinstance (event_name , str )
6512
6600
unique_event_name = self ._make_unique_event_name (event_name )
6513
6601
event = InitEvent (unique_event_name , runnable .ref (), ** kwargs )
6514
6602
self .append_event (event )
6515
6603
return event
6516
6604
6517
6605
def create_operation_invoked_event (self ,
6518
- event_name : str ,
6519
6606
runnable_name : str ,
6520
6607
operation_ref : str ,
6608
+ event_name : str | None = None ,
6521
6609
** kwargs
6522
6610
) -> OperationInvokedEvent :
6523
6611
"""
@@ -6528,7 +6616,6 @@ def create_operation_invoked_event(self,
6528
6616
runnable = self .find_runnable (runnable_name )
6529
6617
if runnable is None :
6530
6618
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6531
- unique_event_name = self ._make_unique_event_name (event_name )
6532
6619
name_parts = split_ref_strict (operation_ref )
6533
6620
if len (name_parts ) == 1 :
6534
6621
port_name , operation_name = name_parts [0 ], None
@@ -6540,6 +6627,19 @@ def create_operation_invoked_event(self,
6540
6627
target_provided_operation = swc .get_operation_in_port (context_port , operation_name )
6541
6628
if target_provided_operation is None :
6542
6629
raise ValueError (f"operation_ref: '{ operation_ref } ' does not name a valid operation in port interface" )
6630
+ if event_name is None :
6631
+ behavior_settings = self ._get_valid_behavior_settings ()
6632
+ if behavior_settings .operation_invoked_event_prefix :
6633
+ prefix = behavior_settings .operation_invoked_event_prefix
6634
+ event_name = prefix + "_" .join ([runnable_name ,
6635
+ context_port .name ,
6636
+ target_provided_operation .name ])
6637
+ else :
6638
+ msg = "event_name: Unable to dynamically create event name," \
6639
+ " operation_invoked_event_prefix is not set in behavior settings"
6640
+ raise RuntimeError (msg )
6641
+ assert isinstance (event_name , str )
6642
+ unique_event_name = self ._make_unique_event_name (event_name )
6543
6643
event = OperationInvokedEvent .make (unique_event_name ,
6544
6644
runnable .ref (),
6545
6645
context_port .ref (),
@@ -6549,9 +6649,9 @@ def create_operation_invoked_event(self,
6549
6649
return event
6550
6650
6551
6651
def create_swc_mode_manager_error_event (self ,
6552
- event_name : str ,
6553
6652
runnable_name : str ,
6554
6653
port_name : str ,
6654
+ event_name : str | None = None ,
6555
6655
** kwargs
6556
6656
) -> SwcModeManagerErrorEvent :
6557
6657
"""
@@ -6561,14 +6661,26 @@ def create_swc_mode_manager_error_event(self,
6561
6661
runnable = self .find_runnable (runnable_name )
6562
6662
if runnable is None :
6563
6663
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6564
- unique_event_name = self ._make_unique_event_name (event_name )
6565
6664
context_port = swc .find_p_port (port_name )
6566
6665
if context_port is None :
6567
6666
raise ValueError (f"port_name: '{ port_name } ' does not name an existing P-PORT or PR-PORT" )
6568
6667
context_mode_declaration_group = swc .get_mode_declaration_group_in_port (context_port )
6569
6668
if context_mode_declaration_group is None :
6570
6669
msg = f"port_name: '{ port_name } ' does not name a valid ModeDeclarationGroupPrototype in port interface"
6571
6670
raise ValueError (msg )
6671
+ if event_name is None :
6672
+ behavior_settings = self ._get_valid_behavior_settings ()
6673
+ if behavior_settings .swc_mode_manager_error_event_prefix :
6674
+ prefix = behavior_settings .swc_mode_manager_error_event_prefix
6675
+ event_name = prefix + "_" .join ([runnable_name ,
6676
+ context_port .name ,
6677
+ context_mode_declaration_group .name ])
6678
+ else :
6679
+ msg = "event_name: Unable to dynamically create event name," \
6680
+ " swc_mode_manager_error_event_prefix is not set in behavior settings"
6681
+ raise RuntimeError (msg )
6682
+ assert isinstance (event_name , str )
6683
+ unique_event_name = self ._make_unique_event_name (event_name )
6572
6684
event = SwcModeManagerErrorEvent .make (unique_event_name ,
6573
6685
runnable .ref (),
6574
6686
context_port .ref (),
@@ -6578,10 +6690,10 @@ def create_swc_mode_manager_error_event(self,
6578
6690
return event
6579
6691
6580
6692
def create_swc_mode_mode_switch_event (self ,
6581
- event_name : str ,
6582
6693
runnable_name : str ,
6583
6694
mode_ref : str | list [str ] | tuple [str , str ],
6584
6695
activation : ar_enum .ModeActivationKind | None = None ,
6696
+ event_name : str | None = None ,
6585
6697
** kwargs
6586
6698
) -> SwcModeSwitchEvent :
6587
6699
"""
@@ -6596,6 +6708,16 @@ def create_swc_mode_mode_switch_event(self,
6596
6708
runnable = self .find_runnable (runnable_name )
6597
6709
if runnable is None :
6598
6710
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6711
+ if event_name is None :
6712
+ behavior_settings = self ._get_valid_behavior_settings ()
6713
+ if behavior_settings .swc_mode_switch_event_prefix :
6714
+ prefix = behavior_settings .swc_mode_switch_event_prefix
6715
+ event_name = prefix + runnable_name
6716
+ else :
6717
+ msg = "event_name: Unable to dynamically create event name," \
6718
+ " swc_mode_switch_event_prefix is not set in behavior settings"
6719
+ raise RuntimeError (msg )
6720
+ assert isinstance (event_name , str )
6599
6721
unique_event_name = self ._make_unique_event_name (event_name )
6600
6722
if isinstance (mode_ref , str ):
6601
6723
context_port , context_mode_declaration_group , target_mode_declaration = (
@@ -6628,17 +6750,27 @@ def create_swc_mode_mode_switch_event(self,
6628
6750
return event
6629
6751
6630
6752
def create_timing_event (self ,
6631
- event_name : str ,
6632
6753
runnable_name : str ,
6633
6754
period : int | float | None = None ,
6634
6755
offset : int | float | None = None ,
6756
+ event_name : str | None = None ,
6635
6757
** kwargs ) -> TimingEvent :
6636
6758
"""
6637
6759
Adds a new TimingEvent to this object
6638
6760
"""
6639
6761
runnable = self .find_runnable (runnable_name )
6640
6762
if runnable is None :
6641
6763
raise KeyError (f"Found no runnable with name '{ runnable_name } '" )
6764
+ if event_name is None :
6765
+ behavior_settings = self ._get_valid_behavior_settings ()
6766
+ if behavior_settings .timing_event_prefix :
6767
+ prefix = behavior_settings .timing_event_prefix
6768
+ event_name = prefix + runnable_name
6769
+ else :
6770
+ msg = "event_name: Unable to dynamically create event name," \
6771
+ " timing_event_prefix is not set in behavior settings"
6772
+ raise RuntimeError (msg )
6773
+ assert isinstance (event_name , str )
6642
6774
unique_event_name = self ._make_unique_event_name (event_name )
6643
6775
event = TimingEvent (unique_event_name , runnable .ref (), period , offset , ** kwargs )
6644
6776
self .append_event (event )
0 commit comments