Rev 1226 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/* Event Generator
*
* Giacomo Guidi
*/
#include <stdio.h>
#include <stdlib.h>
#include "event_gen.h"
#define ACT_HEADER "act_header.h"
#define EXEC_HEADER "exec_header.h"
#define ACT_SINGLE 0
#define ACT_PERIODIC 1
#define ACT_MEAN 2
#define ACT_INVALID 3
#define EXEC_CONST 0
#define EXEC_MEAN 1
#define EXEC_INVALID 2
int act_number
;
int select_act_type
(void)
{
char act_type
[10];
printf("\nInsert the activation type\n");
printf(" S - Single\n");
printf(" P - Periodic\n");
printf(" M - Sporadic with constant distribution (Mean,Delta)\n");
printf("> ");
scanf("%s",act_type
);
switch (act_type
[0]) {
case 's':
case 'S':
return ACT_SINGLE
;
break;
case 'p':
case 'P':
return ACT_PERIODIC
;
break;
case 'm':
case 'M':
return ACT_MEAN
;
break;
default:
return ACT_INVALID
;
}
return ACT_INVALID
;
}
int select_exec_type
(void)
{
char exec_type
[10];
printf("\nInsert the execution time\n");
printf(" C - Const Exec Time\n");
printf(" M - Mean with constant distribution (Mean,Delta)\n");
printf("> ");
scanf("%s",exec_type
);
switch (exec_type
[0]) {
case 'c':
case 'C':
return EXEC_CONST
;
break;
case 'm':
case 'M':
return EXEC_MEAN
;
break;
default:
return EXEC_INVALID
;
}
return EXEC_INVALID
;
}
int write_single_act
(char *task_name
)
{
FILE
*file_act_header
;
int time_usec
;
file_act_header
= fopen(ACT_HEADER
,"a+");
if (file_act_header
== NULL
) return 1;
act_number
= 1;
printf("\nInsert single activation time [us]\n");
printf("> ");
scanf("%d",&time_usec
);
fprintf(file_act_header
,"\nstruct timespec %s_act_event[1] = {%d,%d};\n",
task_name
,time_usec
/1000000,time_usec
%1000000*1000);
fclose(file_act_header
);
return 0;
}
int write_periodic_act
(char *task_name
)
{
FILE
*file_act_header
;
int i
,first_time_usec
,per_time_usec
;
long long tot_time_usec
;
file_act_header
= fopen(ACT_HEADER
,"a+");
if (file_act_header
== NULL
) return 1;
printf("\nInsert the number of activations\n");
printf("> ");
scanf("%d",&act_number
);
printf("Insert first activation time [us]\n");
printf("> ");
scanf("%d",&first_time_usec
);
printf("Insert periodic activation time [us]\n");
printf("> ");
scanf("%d",&per_time_usec
);
fprintf(file_act_header
,"\nstruct timespec %s_act_event[%d] = {{%d,%d},\n",
task_name
,act_number
,first_time_usec
/1000000,first_time_usec
%1000000*1000);
tot_time_usec
= first_time_usec
;
for (i
=0;i
<act_number
-1;i
++) {
tot_time_usec
+= per_time_usec
;
fprintf(file_act_header
," {%d,%d},\n",
(int)tot_time_usec
/1000000,(int)tot_time_usec
%1000000*1000);
}
fprintf(file_act_header
,"};\n");
fclose(file_act_header
);
return 0;
}
int write_mean_act
(char *task_name
)
{
FILE
*file_act_header
;
int i
,first_time_usec
,mean_time_usec
,delta_time_usec
;
long long tot_time_usec
;
file_act_header
= fopen(ACT_HEADER
,"a+");
if (file_act_header
== NULL
) return 1;
printf("\nInsert the number of activations\n");
printf("> ");
scanf("%d",&act_number
);
printf("Insert first activation time [us]\n");
printf("> ");
scanf("%d",&first_time_usec
);
printf("Insert mean peridic time [us]\n");
printf("> ");
scanf("%d",&mean_time_usec
);
printf("Insert delta time [us]\n");
printf("> ");
scanf("%d",&delta_time_usec
);
fprintf(file_act_header
,"\nstruct timespec %s_act_event[%d] = {{%d,%d},\n",
task_name
,act_number
,first_time_usec
/1000000,first_time_usec
%1000000*1000);
tot_time_usec
= first_time_usec
;
for (i
=0;i
<act_number
-1;i
++) {
tot_time_usec
+= mean_time_usec
+ random
() % delta_time_usec
- delta_time_usec
/2;
fprintf(file_act_header
," {%d,%d},\n",
(int)tot_time_usec
/1000000,(int)tot_time_usec
%1000000*1000);
}
fprintf(file_act_header
,"};\n");
fclose(file_act_header
);
return 0;
}
int write_exec_const
(char *task_name
)
{
FILE
*file_exec_header
;
int exec_time_usec
,i
;
file_exec_header
= fopen(EXEC_HEADER
,"a+");
if (file_exec_header
== NULL
) return 1;
printf("Insert execution time [us]\n");
printf("> ");
scanf("%d",&exec_time_usec
);
fprintf(file_exec_header
,"\nstruct timespec %s_exec_time[%d] = {{%d,%d},\n",
task_name
,act_number
,exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
for (i
=0; i
< act_number
-1; i
++)
fprintf(file_exec_header
," {%d,%d},\n",
exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
fprintf(file_exec_header
,"};\n");
fclose(file_exec_header
);
return 0;
}
int write_exec_mean
(char *task_name
)
{
FILE
*file_exec_header
;
int exec_time_usec
,mean_time_usec
,delta_time_usec
,i
;
file_exec_header
= fopen(EXEC_HEADER
,"a+");
if (file_exec_header
== NULL
) return 1;
printf("Insert mean execution time [us]\n");
printf("> ");
scanf("%d",&mean_time_usec
);
printf("Insert delta execution time [us]\n");
printf("> ");
scanf("%d",&delta_time_usec
);
exec_time_usec
= mean_time_usec
+ random
() % delta_time_usec
- delta_time_usec
/ 2;
fprintf(file_exec_header
,"\nstruct timespec %s_exec_time[%d] = {{%d,%d},\n",
task_name
,act_number
,exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
for (i
=0; i
< act_number
-1; i
++) {
exec_time_usec
= mean_time_usec
+ random
() % delta_time_usec
- delta_time_usec
/ 2;
fprintf(file_exec_header
," {%d,%d},\n",
exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
}
fprintf(file_exec_header
,"};\n");
fclose(file_exec_header
);
return 0;
}
int main
(void) {
char task_name
[100];
char act_type
,exec_type
;
int err
;
printf("\nEvent Generator\n\n");
srandom
(12354132);
while(1) {
printf("Insert the task name\n");
printf("Write \"q\" to quit program\n");
printf("> ");
scanf("%s",task_name
);
if (strlen(task_name
) == 1 && task_name
[0] == 'q') exit(0);
while((act_type
= select_act_type
()) == ACT_INVALID
) {
printf("Error: Invalid Act Type\n");
}
switch (act_type
) {
case ACT_SINGLE
:
err
= write_single_act
(task_name
);
if (err
!= 0) {
printf("Error writing activation header\n");
exit(1);
}
break;
case ACT_PERIODIC
:
err
= write_periodic_act
(task_name
);
if (err
!= 0) {
printf("Error writing activation header\n");
exit(1);
}
break;
case ACT_MEAN
:
err
= write_mean_act
(task_name
);
if (err
!= 0) {
printf("Error writing activation header\n");
exit(1);
}
break;
}
while((exec_type
= select_exec_type
()) == EXEC_INVALID
) {
printf("Error: Invalid Exec Type\n");
}
switch (exec_type
) {
case EXEC_CONST
:
err
= write_exec_const
(task_name
);
if (err
!= 0) {
printf("Error writing exec header\n");
exit(1);
}
break;
case EXEC_MEAN
:
err
= write_exec_mean
(task_name
);
if (err
!= 0) {
printf("Error writing exec header\n");
exit(1);
}
break;
}
}
return 0;
}