Renamed the class from Command to ClosedLoopCommand. Also renamed the APIs from StartController to StartClosedLoop and from StopController to StopClosedLoop.
Changed so that calling SetCommandPos and SetFeedbackPos at the same timing now returns an error. Due to the nature of these two functions, calling them at the same timing can cause issues.
For synchronization compensation, only slave axis parameters are used, not master axis parameters. This applies to synchronization gain, synchronization width, and compensation limit parameters.
Changed the default value of the Limit Switch Type (LS Type) parameter from None to Dec. This is to minimize position error when the limit switch is released.
Clarified the conditional behavior of API buffer control functions Execute, Halt, Clear, and Rewind. When called on a channel that is currently in recording state, these functions return the AlreadyRecordingForSpecifiedChannel error. When called on a channel that is not recording, they are either recorded to the API buffer if another channel is recording, or executed immediately if recording is not active.
Added a blockIndex parameter (default 0) to the Rewind function to enable rewinding to a specified block index. This allows partial re-execution from a specified position within the buffer contents. Added the RewindBlockIndexOutOfRange error code returned when the specified block index exceeds the current block count.
Renamed multi-channel API buffer functions from ExecuteMultipleChannel, HaltMultipleChannel, ClearMultipleChannel, RewindMultipleChannel to overloaded Execute, Halt, Clear, Rewind functions using the ApiBufferChannelSelection parameter.
Renamed error code NotGateNodeHasChildren to NotGateNodeInvalidChildCount.
Changed the second parameter of FlowIf (multi-condition overload) from ApiBufferCondition* to ApiBufferMultiCondition* to allow multi-condition trees to be used in wait clauses as well. Existing code passing ApiBufferCondition* as the second argument must be updated.
Added a Wait function overload with the ApiBufferMultiCondition parameter for multi-condition tree wait logic using logical gate nodes (AND, OR, XOR, NOT).
Added new error codes XorGateNodeInvalidChildCount and InvalidConditionType.
Inserted the RewindBlockIndexOutOfRange error code at position 0x12006, shifting the integer values of subsequent error codes by 1 (e.g., AlreadyRecordingForSpecifiedChannel changed from 73734 to 73735). Users who have hardcoded error code values in log parsers or diagnostic tools must update accordingly.
Standardized the naming convention of Closed-Loop API member functions from camelCase to PascalCase. Ramp (e.g., fromRate → FromRate, fromTime → FromTime), ClosedLoopOptions (e.g., setRamp → SetRamp, setControlOutputOffset → SetControlOutputOffset), ClosedLoopCommand (e.g., setTrigger → SetTrigger, setOptions → SetOptions). The PIDGain wrapper class has been removed. Use SetPIDGain or field-specific setters (SetProportionalGain, SetIntegralGain, SetDerivativeGain) instead.
Consolidated torque command classes into a single TrqCommand class using the builder pattern. The following v3.6 classes have been removed: TriggerTrqCommand, RampTimeTrqCommand, TriggerRampTimeTrqCommand, RampRateTrqCommand, TriggerRampRateTrqCommand. Use the SetTrigger, SetRamp, SetRampRate, SetRampTime, SetMaxMotorSpeed, and Clear methods of the consolidated TrqCommand instead. The 60 StartTrq / StartPosToTrq / StartVelToTrq overload declarations have been consolidated into 6 unified signatures with TriggerEvents* pTriggerEvents = NULL as the last parameter.
For multi-axis overloads, all commands in a batch must share the same trigger configuration. If configurations do not match, InvalidTriggerArgument is returned. Trigger conditions can be specified via either the command object's SetTrigger method or the pTriggerEvents parameter. Specifying both returns InvalidTriggerArgument. The following v3.6 functions have been replaced by the consolidated functions:
StartRampTimeTrq, StartRampRateTrq → StartTrq (use SetRamp);
StartPosToRampTimeTrq, StartPosToRampRateTrq → StartPosToTrq (use SetRamp);
StartVelToRampTimeTrq, StartVelToRampRateTrq → StartVelToTrq (use SetRamp).
Changed the torque ramp time unit from interrupt cycle count (unsigned int) to seconds (double). In v3.6, ramp time was specified in interrupt cycle count via rampCycleTime. In v3.7, ramp time is specified in seconds via Ramp::FromTime. To convert existing v3.6 values: timeSeconds = rampCycleTime * interruptPeriod_ms / 1000.0 (interruptPeriod_ms is the interrupt period in milliseconds). For example, if the interrupt period is 1 ms and the v3.6 ramp cycle time is 500 cycles, the v3.7 equivalent is 500 * 1 / 1000.0 = 0.5 seconds.
Moved torque limit and max motor speed setting functions from the Torque and Velocity classes to the Config class. These are axis-level parameters that affect all motion modes. The following functions have been moved:
Renamed the SyncGroup member allowAmpErrorServoOn to allowServoOnDuringAmpError.
Converted unsigned char fields with boolean semantics to bool across all module API headers (CoreMotion, AdvancedMotion, Event, IO, Log, ApiBuffer, UserMemory, WMX3Api, CCLink). Fields representing true/false states (e.g., enable, invert, clockwise, suspend) have been changed to bool. Fields used as sign multiplication operators (e.g., rotationalAxisPolarity, localCenterOfRotationDirection, axisPolarity, axisCoordinateFlip) remain as char. All user code must be recompiled with the new headers.
Changed the WMX3APIFUNC return type from long to int. On Windows/MSVC, both long and int are 32-bit, so there is no ABI change. User code that explicitly stores return values as long must be updated to int.
Changed the SleepAtEngine parameter type from unsigned long to unsigned int. On Windows/MSVC, both types are 32-bit, so there is no ABI change.
Removed the :long underlying type specifier from CLR enum class declarations. On Windows/MSVC, long (32-bit) is the same as the default int (32-bit), so there is no change to the .NET metadata type (System.Int32).
Standardized abbreviation casing in public API identifiers of E-CAM, Closed-Loop PID, I/O, and Simulator modules to comply with C++ abbreviation naming conventions (abbreviations in PascalCase identifiers are always fully uppercase; in camelCase identifiers, fully uppercase in middle or end positions). This is a mechanical identifier rename with no behavioral change, but all user code must be updated to the new names and recompiled.
Changed the epoch (reference time) represented by the timestamp member of ApiLogInfo.
Consolidated velocity command classes into a single VelCommand class using the builder pattern. The following v3.6 classes have been removed: TimedVelCommand, TriggerVelCommand, TriggerTimedVelCommand. Use the SetTrigger, SetRunTime, SetMaxTrqLimit, and Clear methods of the consolidated VelCommand instead. The 32 StartVel / StartPosToVel / StartTrqToVel overload declarations have been consolidated into 6 unified signatures. For multi-axis StartVel, all commands in a batch must share the same trigger configuration. If configurations do not match, InvalidTriggerArgument is returned. Trigger conditions can be specified via either the command object's SetTrigger method or the pTriggerEvents parameter. Specifying both returns InvalidTriggerArgument.