Rev 1225 |
Rev 1227 |
Go to most recent revision |
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 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;
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);
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
,act_num
;
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_num
);
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_num
,first_time_usec
/1000000,first_time_usec
%1000000);
tot_time_usec
= first_time_usec
;
for (i
=0;i
<act_num
-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);
}
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
,act_num
,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_num
);
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_num
,first_time_usec
/1000000,first_time_usec
%1000000);
tot_time_usec
= first_time_usec
;
for (i
=0;i
<act_num
-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);
}
fprintf(file_act_header
,"};\n");
fclose(file_act_header
);
return 0;
}
int write_exec_const
(char *task_name
)
{
return 0;
}
int write_exec_mean
(char *task_name
)
{
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;
}