Subversion Repositories shark

Rev

Rev 1232 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* Event Generator
 *
 * Giacomo Guidi
 */


#include <stdio.h>
#include <stdlib.h>

#define EVENT_HEADER "event_header.h"
#define ACT_LIST "act_list.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 write_struct(void)
{

  FILE *file_event_header;

  file_event_header = fopen(EVENT_HEADER,"w");
  if (file_event_header == NULL) return 1;

  fprintf(file_event_header, "\n#include \"%s\"\n\n",ACT_LIST);

  fprintf(file_event_header, "struct loader_task loader_task_list[] = {\n");

  fclose(file_event_header);

  return 0;

}

int select_basic_par(char *task_name)
{

  int number,group,server,deadline,wcet,local_scheduler;
  FILE *file_event_header;

  printf("\nInsert the number of tasks\n");
  printf("> ");
  scanf("%d",&number);
  printf("Insert the group number\n");
  printf("> ");
  scanf("%d",&group);
  printf("Insert the server number\n");
  printf("> ");
  scanf("%d",&server);

  printf("Insert the local scheduler type\n");
  printf(" 0 - POSIX\n");
  printf(" 1 - EDF\n");
  printf(" 2 - RM\n");
  printf(" 3 - MPEGSTAR\n");
  printf("> ");
  scanf("%d",&local_scheduler);

  printf("Insert the deadline [us]\n");
  printf("> ");
  scanf("%d",&deadline);
  printf("Insert the wcet [us]\n");
  printf("> ");
  scanf("%d",&wcet);

  file_event_header = fopen(EVENT_HEADER,"a+");
  if (file_event_header == NULL) return 1;
                                                                                                                             
  fprintf(file_event_header, "  {\"%s\",%d,%d,%d,%d,{%d,%d},{%d,%d},ACT_NUMBER_%s,act_%s,exec_%s},\n",
                             task_name,number,group,server,local_scheduler,deadline / 1000000, deadline % 1000000 * 1000,
                             wcet / 1000000, wcet % 1000000 * 1000, task_name, task_name, task_name);

  fclose(file_event_header);

  return 0;  

}

int close_loader()
{

  FILE *file_event_header;

  file_event_header = fopen(EVENT_HEADER,"a+");
  if (file_event_header == NULL) return 1;

  fprintf(file_event_header,"};\n\n");

  fclose(file_event_header);

  return 0;

}

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 - Variable 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_LIST,"a+");
  if (file_act_header == NULL) return 1;

  act_number = 1;
  fprintf(file_act_header,"\n#define ACT_NUMBER_%s %d\n\n",task_name,act_number);

  printf("\nInsert single activation time [us]\n");
  printf("> ");
  scanf("%d",&time_usec);

  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d}};\n\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_LIST,"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,"\n#define ACT_NUMBER_%s %d\n\n",task_name,act_number);
                                                                                                                           
  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",task_name,
          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\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_LIST,"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,"\n#define ACT_NUMBER_%s %d\n\n",task_name,act_number);
                                                                                                                             
  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",task_name,
          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\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(ACT_LIST,"a+");
  if (file_exec_header == NULL) return 1;
                                   
  printf("Insert execution time [us]\n");
  printf("> ");
  scanf("%d",&exec_time_usec);
                     
  fprintf(file_exec_header,"struct timespec exec_%s[] =  {{%d,%d},\n",task_name,
          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\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(ACT_LIST,"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,"struct timespec exec_%s[] = {{%d,%d},\n",
          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\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);

  write_struct();

  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') {
      close_loader();
      exit(0);
    }

    select_basic_par(task_name);

    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;

}