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 messages_to_read = controller.NetworkLogMessageCountGet()
70
71 for i in range(messages_to_read):
72 print(controller.NetworkLogMessageGet(i))
73 print("Expected OPERATIONAL state but the network did not get there.")
74
75 else:
76 print("Network Started")
77
78def abort_motion_object(motion_object):
79
80
81
82 motion_object.EStopAbort()
83 motion_object.MotionDoneWait()
84 motion_object.ClearFaults()
85
86
87 verify_idle_state(motion_object)
88
89def verify_idle_state(motion_object):
90
91
92 if motion_object.StateGet() != RapidCode.RSIState_RSIStateIDLE:
93 source = motion_object.SourceGet()
94 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')}. " \
95 f"\nError Source: {motion_object.SourceNameGet(source)}"
96 raise Exception(error_msg)
97
98def enum_to_name(value, prefix):
99 """Reverse lookup: int value -> enum name"""
100 for name in dir(RapidCode):
101 if name.startswith(prefix + "_" + prefix) and getattr(RapidCode, name) == value:
102 return name.split(prefix + "_" + prefix)[1]
103 return str(value)