|  | @@ -32,14 +32,12 @@
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "src/core/lib/transport/pid_controller.h"
 | 
	
		
			
				|  |  | +#include <grpc/support/useful.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_pid_controller_init(grpc_pid_controller *pid_controller,
 | 
	
		
			
				|  |  | -                              double initial_control_value, double gain_p,
 | 
	
		
			
				|  |  | -                              double gain_i, double gain_d) {
 | 
	
		
			
				|  |  | -  pid_controller->last_control_value = initial_control_value;
 | 
	
		
			
				|  |  | -  pid_controller->gain_p = gain_p;
 | 
	
		
			
				|  |  | -  pid_controller->gain_i = gain_i;
 | 
	
		
			
				|  |  | -  pid_controller->gain_d = gain_d;
 | 
	
		
			
				|  |  | +                              grpc_pid_controller_args args) {
 | 
	
		
			
				|  |  | +  pid_controller->args = args;
 | 
	
		
			
				|  |  | +  pid_controller->last_control_value = args.initial_control_value;
 | 
	
		
			
				|  |  |    grpc_pid_controller_reset(pid_controller);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -53,13 +51,20 @@ double grpc_pid_controller_update(grpc_pid_controller *pid_controller,
 | 
	
		
			
				|  |  |    /* integrate error using the trapezoid rule */
 | 
	
		
			
				|  |  |    pid_controller->error_integral +=
 | 
	
		
			
				|  |  |        dt * (pid_controller->last_error + error) * 0.5;
 | 
	
		
			
				|  |  | +  pid_controller->error_integral = GPR_CLAMP(
 | 
	
		
			
				|  |  | +      pid_controller->error_integral, -pid_controller->args.integral_range,
 | 
	
		
			
				|  |  | +      pid_controller->args.integral_range);
 | 
	
		
			
				|  |  |    double diff_error = (error - pid_controller->last_error) / dt;
 | 
	
		
			
				|  |  |    /* calculate derivative of control value vs time */
 | 
	
		
			
				|  |  | -  double dc_dt = pid_controller->gain_p * error +
 | 
	
		
			
				|  |  | -                 pid_controller->gain_i * pid_controller->error_integral +
 | 
	
		
			
				|  |  | -                 pid_controller->gain_d * diff_error;
 | 
	
		
			
				|  |  | +  double dc_dt = pid_controller->args.gain_p * error +
 | 
	
		
			
				|  |  | +                 pid_controller->args.gain_i * pid_controller->error_integral +
 | 
	
		
			
				|  |  | +                 pid_controller->args.gain_d * diff_error;
 | 
	
		
			
				|  |  | +  /* and perform trapezoidal integration */
 | 
	
		
			
				|  |  |    double new_control_value = pid_controller->last_control_value +
 | 
	
		
			
				|  |  |                               dt * (pid_controller->last_dc_dt + dc_dt) * 0.5;
 | 
	
		
			
				|  |  | +  new_control_value =
 | 
	
		
			
				|  |  | +      GPR_CLAMP(new_control_value, pid_controller->args.min_control_value,
 | 
	
		
			
				|  |  | +                pid_controller->args.max_control_value);
 | 
	
		
			
				|  |  |    pid_controller->last_error = error;
 | 
	
		
			
				|  |  |    pid_controller->last_dc_dt = dc_dt;
 | 
	
		
			
				|  |  |    pid_controller->last_control_value = new_control_value;
 |