Subversion Repositories shark

Rev

Rev 1225 | 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;

}