#include #include #include #include #include #include #include #include #include #include #include #include #include #include "hinf.h" #define __STR(f) #f #define STR(f) __STR(f) volatile float * time_resp; volatile double * cont_real; volatile struct my_msg_struct * msg; static void emergency_stop(int d) { msg->command = STOP_TASK; mbuff_free("time_resp",(void*)time_resp); mbuff_free("cont_real",(void*)cont_real); mbuff_free("msg",(void*)msg); exit(1); } int main(int argc, char *argv[]) { int i, j, count; FILE *fp, *fp2, *fp3; // controller realization fp = fopen("data/controller.dat", "r"); if(fp == NULL){ fprintf(stderr, "cannot open controller.dat\n"); exit(1); } // controller order fp2 = fopen("data/controller_order.dat", "r"); if(fp2 == NULL){ fprintf(stderr, "cannot open controller_order.dat\n"); exit(1); } // time response result fp3 = fopen("data/result.dat", "w"); if(fp3 == NULL){ fprintf(stderr, "cannot open result.dat\n"); exit(1); } if((time_resp = (volatile float*) mbuff_alloc("time_resp", BUF_LEN * RECORDING_SAMPLES * sizeof(float))) == NULL){ fprintf(stderr, "mbuff_alloc failed for time_resp\n"); return -1; } if((msg = (volatile struct my_msg_struct*) mbuff_alloc("msg", sizeof(struct my_msg_struct))) == NULL){ fprintf(stderr, "mbuff_alloc failed \n"); return -1; } msg->command = STOP_TASK; signal(SIGINT, emergency_stop); fscanf(fp, "%lf", &msg->sampling_period); msg->sampling_period = 0.25e-3; fprintf(stderr, "sampling time = %f\n", msg->sampling_period); fscanf(fp2, "%d", &msg->order); fprintf(stderr, "order of the controller = %d\n", msg->order); if((cont_real = (volatile double *) mbuff_alloc("cont_real", (msg->order + 1)*(msg->order + 1) * sizeof(double))) == NULL){ fprintf(stderr, "mbuff_alloc failed for cont_real\n"); return -1; } #ifdef PACK for(i = 0; i < msg->order + 1; i++){ // i行 for(j = 0; j < msg->order + 1; j++){ // j列 fscanf(fp, "%lf", &cont_real[i * (msg->order + 1) + j]); } } #else // 行列A for(i = 0; i < msg->order; i++){ // i行 for(j = 0; j < msg->order; j++){ // j列 fscanf(fp, "%lf", &cont_real[i * (msg->order + 1) + j]); } } // 行列B for(i = 0; i < msg->order; i++) fscanf(fp, "%lf", &cont_real[i * (msg->order + 1) + msg->order]); // 行列C for(j = 0; j < msg->order; j++) fscanf(fp, "%lf", &cont_real[msg->order * (msg->order+1) + j]); // スカラD fscanf(fp, "%lf", &cont_real[msg->order * (msg->order+1) + msg->order]); #endif time_resp[BUF_LEN * (RECORDING_SAMPLES - 1)] = -1.; // `-1' is a flag which is located at the last array to which time is recorded, and means that experiment is not finished // Now start the tasks fprintf(stderr, "Starting real time task ... "); msg->command = START_TASK; fprintf(stderr, "done.\n"); fprintf(stderr, "Waiting for record ... "); while (time_resp[BUF_LEN * (RECORDING_SAMPLES - 1)] < 0.); // if the experiment complete, then the flag '-1' must be overwritten by positive number of time fprintf(stderr, "done.\n"); count = 0; for(i = 0; i < RECORDING_SAMPLES; i++){ for(j = 0; j < BUF_LEN; j++){ fprintf(fp3, "%g ", time_resp[count++]); } fprintf(fp3, "\n"); } mbuff_free("time_resp",(void*)time_resp); mbuff_free("cont_real",(void*)cont_real); mbuff_free("msg", (void*)msg); fclose(fp); fclose(fp2); fclose(fp3); return 0; }