src/Pid.cpp (39 lines of code) (raw):
#include "Pid.hpp"
//Constructor
Pid::Pid(double _p_gain,double _i_gain,double _d_gain,double _target){
    wrapper_of_constructor(_p_gain,_i_gain,_d_gain,0,0,_target,0);
/*    FILE *fp;
    if ((fp = fopen("test.csv", "w")) == NULL) {
            printf("file open error!!\n");
            return;
    }
    fprintf(fp, "light_value, integral, pg, ig, dg, p, i, d, diff, old_diff, output\n");
    fclose(fp);
*/
}
//wrapper
void Pid::wrapper_of_constructor(double _p_gain, double _i_gain, double _d_gain,
        double _diff, double _integral, double _target, double _output) {
    p_gain   = _p_gain;
    i_gain   = _i_gain;
    d_gain   = _d_gain;
    old_diff = _diff;
    integral = _integral;
    target   = _target;
    output   = _output;
    del      = 0.004;
}
void Pid::calculate(double light_value) {
    double p,i,d;
    double diff = light_value - target;
/*    FILE *fp;
    if ((fp = fopen("test.csv", "a")) == NULL) {
            printf("file open error!!\n");
            return;
    }
*/
    integral += (old_diff + diff)/2 * del;
    p =  p_gain * diff;
    i = i_gain * integral;
    d = d_gain * (diff - old_diff)/del;
    old_diff = diff;
    output = p + i + d;
//    fprintf(fp, "%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf\n",
//    light_value, integral, p_gain, i_gain, d_gain, p, i, d, diff, old_diff, output);
//    fclose(fp);
}
double Pid::get_output() {
    return output;
}
/*
 * PID値を入力する
 */
void Pid::setPid(double _p_gain, double _i_gain, double _d_gain, double _target) {
    p_gain = _p_gain;
    i_gain = _i_gain;
    d_gain = _d_gain;
    target = _target;
}
double Pid::limitOutput(double pid_value){
    if(pid_value > 100.0) return 100.0;
    if(pid_value < -100.0) return -100.0;
    return pid_value;
}