1""" Helper functions for RapidCode Python samples.
2"""
3
4from _imports import RapidCode, RAPIDCODE_DIR, constants, platform
5
6
7def get_enum_name(prefix: str, value: int) -> str:
8 """Get enum name using reflection on SWIG-generated constants.
9
10 Args:
11 prefix: The enum prefix (e.g., "RSINetworkState_RSINetworkState")
12 value: The enum value to look up
13
14 Returns:
15 The enum name with prefix stripped, or "UNKNOWN(value)" if not found
16
17 Example:
18 get_enum_name("RSINetworkState_RSINetworkState", controller.NetworkStateGet())
19 # Returns "OPERATIONAL" for RSINetworkState_RSINetworkStateOPERATIONAL
20 """
21 for name in dir(RapidCode):
22 if name.startswith(prefix):
23 if getattr(RapidCode, name) == value:
24 return name[len(prefix):]
25 return f"UNKNOWN({value})"
26
27
28def get_creation_parameters():
29
30
31 creation_params: RapidCode.CreationParameters = RapidCode.CreationParameters()
32 creation_params.RmpPath = RAPIDCODE_DIR
33 creation_params.NicPrimary = constants.RMP_NIC_PRIMARY
34
35 if platform.system() == "Windows":
36 creation_params.NodeName = constants.RMP_NODE_NAME
37 elif platform.system() == "Linux":
38 creation_params.CpuAffinity = constants.RMP_CPU_AFFINITY
39 else:
40 raise Exception("Unsupported platform")
41
42 return creation_params
43
44def check_errors(rsi_object):
45
46
47
48 error_string_builder = ""
49 i = rsi_object.ErrorLogCountGet()
50 while rsi_object.ErrorLogCountGet() > 0:
51 error:RapidCode.RsiError = rsi_object.ErrorLogGet()
52 error_type = "WARNING" if error.isWarning else "ERROR"
53 error_string_builder += f"{error_type}: {error.text}\n"
54 if len(error_string_builder) > 0:
55 print(error_string_builder)
56 if "ERROR" in error_string_builder:
57 raise Exception(error_string_builder)
58 return "ERROR" in error_string_builder, error_string_builder
59
60def start_the_network(controller):
61
62
63
64 if controller.NetworkStateGet() != RapidCode.RSINetworkState_RSINetworkStateOPERATIONAL:
65 print("Starting Network..")
66 controller.NetworkStart()
67
68 if controller.NetworkStateGet() != RapidCode.RSINetworkState_RSINetworkStateOPERATIONAL:
69 start_error = controller.LastNetworkStartErrorGet()
70 print(
71 "Network start error: "
72 f"{enum_to_name(start_error, 'RSINetworkStartError')} ({start_error})"
73 )
74
75 messages_to_read = controller.NetworkLogMessageCountGet()
76
77 for i in range(messages_to_read):
78 print(controller.NetworkLogMessageGet(i))
79 print("Expected OPERATIONAL state but the network did not get there.")
80
81 else:
82 print("Network Started")
83
84def abort_motion_object(motion_object):
85
86
87
88 motion_object.EStopAbort()
89 motion_object.MotionDoneWait()
90 motion_object.ClearFaults()
91
92
93 verify_idle_state(motion_object)
94
95def verify_idle_state(motion_object):
96
97
98 if motion_object.StateGet() != RapidCode.RSIState_RSIStateIDLE:
99 source = motion_object.SourceGet()
100 error_msg = f"Axis or MultiAxis {motion_object.NumberGet()} is expected to be in IDLE state, but is in state {enum_to_name(motion_object.StateGet(), 'RSIState')}. " \
101 f"\nError Source: {motion_object.SourceNameGet(source)}"
102 raise Exception(error_msg)
103
104def enum_to_name(value, prefix):
105 """Reverse lookup: int value -> enum name"""
106 for name in dir(RapidCode):
107 if name.startswith(prefix + "_" + prefix) and getattr(RapidCode, name) == value:
108 return name.split(prefix + "_" + prefix)[1]
109 return str(value)