Subversion Repositories shark

Rev

Rev 1226 | 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_SINGLE 0
#define ACT_PERIODIC 1
#define ACT_MEAN 2
#define ACT_INVALID 3

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 write_single_act(char *task_name)
{

  FILE *file_act_header;
  int time_usec;

  file_act_header = fopen("test_header.h","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("test_header.h","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("test_header.h","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 main(void) {

  char task_name[100];
  char act_type;
  int err;

  printf("\nEvent Generator\n\n");

  srandom(12354132);

  printf("Insert the name of the task\n");
  printf("> ");
  scanf("%s",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;
  }

  return 0;

}