/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_CORE_LIB_TRANSPORT_PID_CONTROLLER_H #define GRPC_CORE_LIB_TRANSPORT_PID_CONTROLLER_H /* \file Simple PID controller. Implements a proportional-integral-derivative controller. Used when we want to iteratively control a variable to converge some other observed value to a 'set-point'. Gains can be set to adjust sensitivity to current error (p), the integral of error (i), and the derivative of error (d). */ typedef struct { double gain_p; double gain_i; double gain_d; double initial_control_value; double min_control_value; double max_control_value; double integral_range; } grpc_pid_controller_args; typedef struct { double last_error; double error_integral; double last_control_value; double last_dc_dt; grpc_pid_controller_args args; } grpc_pid_controller; /** Initialize the controller */ void grpc_pid_controller_init(grpc_pid_controller *pid_controller, grpc_pid_controller_args args); /** Reset the controller: useful when things have changed significantly */ void grpc_pid_controller_reset(grpc_pid_controller *pid_controller); /** Update the controller: given a current error estimate, and the time since the last update, returns a new control value */ double grpc_pid_controller_update(grpc_pid_controller *pid_controller, double error, double dt); /** Returns the last control value calculated */ double grpc_pid_controller_last(grpc_pid_controller *pid_controller); #endif /* GRPC_CORE_LIB_TRANSPORT_PID_CONTROLLER_H */