aboutsummaryrefslogtreecommitdiff
path: root/tests/jittertest/plotJittervsFill.c
blob: f9427f165277b8fd3a10397d33f55fd8471f4989 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/*
 ***********************************************************************
 *
 *  Copyright:          Daniel Measurement and Control, Inc.
 *                           9753 Pine Lake Drive
 *                             Houston, TX 77055
 *
 *  Created by: Vipin Malik
 *  Released under GPL by permission of Daniel Industries.
 *
 * This software is licensed under the GPL version 2. Plese see the file
 * COPYING for details on the license.
 *
 * NO WARRANTY: Absolutely no claims of warranty or fitness of purpose
 *              are made in this software. Please use at your own risk.
 *
  File: plotJittervsFill.c
  By: Vipin Malik

  About: This program reads in a jitter log file as created
  by the JitterTest.c program and extracts all the jitters
  in the file that are greater than a threshold specified
  as a parameter on the cmd line. It also extracts the
  amount of disk space at (form the "df" out that should also
  be present in the log file) after the jitter extracted.

  It writes the data to the stderr (where you may redirect it).
  It is suitable for plotting, as the data is written as
  COL1=UsedSpace COL2=Jitter

  $Id: plotJittervsFill.c,v 1.6 2005/11/07 11:15:21 gleixner Exp $
  $Log: plotJittervsFill.c,v $
  Revision 1.6  2005/11/07 11:15:21  gleixner
  [MTD / JFFS2] Clean up trailing white spaces

  Revision 1.5  2001/08/10 19:23:11  vipin
  Ready to be released under GPL! Added proper headers etc.

  Revision 1.4  2001/07/02 22:25:40  vipin
  Fixed couple of minor cosmetic typos.

  Revision 1.3  2001/07/02 14:46:46  vipin
  Added a debug option where it o/p's line numbers to debug funky values.

  Revision 1.2  2001/06/26 19:48:57  vipin
  Now prints out jitter values found at end of log file, after which
  no new "df" disk usage values were encountered. The last "df" disk usage
  encountered is printed for these orphaned values.

  Revision 1.1  2001/06/25 19:13:55  vipin
  Added new file- plotJittervsFill.c- that mines the data log file
  outputed from the fillFlash.sh script file and JitterTest.c file
  and produces output suitable to be plotted.
  This output plot may be examined to see visually the relationship
  of the Jitter vs disk usage of the fs under test.

 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#define PROGRAM_NAME "plotJittervsFill"
#include "common.h"

static char LogFile[250] = "InputLogFile.log";

static int JitterThreshold_ms = 1000;
static int Debug = 0; /* Debug level. Each "-d" on the cmd line increases the level */

#define TRUE  1
#define FALSE 0

#define MIN_JITTER_THRESHOLD 1 /* ms minimum jitter threshold */

void PrintHelpInfo(void)
{
    printf("Usage: plotJittervsFill [options] -f [--file] <input log file name> -t [--jitter_threshold] <jitter threshold in ms>\n");
    printf("[options]:\n-v [--version] Print version and exit\n");
    printf("-d Debug. Prints input file line number for each data point picked up.\n");
    printf("-h [--help] [-?] Print this help screen and exit.\n");
}



/***********************************************************************
 *                             HandleCmdLineArgs
 *  This function handles the command line arguments.
 *  output: stack size
 ***********************************************************************/
void HandleCmdLineArgs(
    int argc,                       /* number of command-line arguments */
    char *argv[])                   /* ptrs to command-line arguments   */
{
    int argNum;                     /* argument number                  */

    if (argc > (int) 1) {

        for (argNum = (int) 1; argNum < argc; argNum++) {

            /* The command line contains an argument. */

            if ((strcmp(argv[argNum],"--version") == 0) ||
                (strcmp(argv[argNum],"-v")        == 0)) {
                /* Print version information and exit. */
                common_print_version();
                exit(0);
            }

            else if ((strcmp(argv[argNum],"--help") == 0) ||
                     (strcmp(argv[argNum],"-h")     == 0) ||
                     (strcmp(argv[argNum],"-?")     == 0)) {
                /* Print help information and exit. */
                PrintHelpInfo();
                exit(0);
            }

            else if ((strcmp(argv[argNum],"--file") == 0) ||
                     (strcmp(argv[argNum],"-f")     == 0)) {
                /* Set the name of the output file. */
                ++argNum;
                if (argNum < argc) {
                    strncpy(LogFile, argv[argNum], sizeof(LogFile));
                }
                else {
                    printf("*** Input file name not specified. ***\n");
                    exit(0);
                }
            }

            else if ((strcmp(argv[argNum],"--jitter_threshold") == 0) ||
                     (strcmp(argv[argNum],"-t") == 0)) {
                /* Set the file to read*/
                ++argNum;

                JitterThreshold_ms = atoi(argv[argNum]);

                if(JitterThreshold_ms < MIN_JITTER_THRESHOLD)
                {
                    printf("A jitter threshold less than %i ms is not allowed. Bye.\n",
                           MIN_JITTER_THRESHOLD);
                    exit(0);
                }
            }

            else if ((strcmp(argv[argNum],"-d") == 0))
            {
                /* Increment debug level */

                Debug++;
            }

            else {
                /* Unknown argument. Print help information and exit. */
                printf("Invalid option %s\n", argv[argNum]);
                printf("Try 'plotJittervsFill --help' for more information.\n");
                exit(0);
            }
        }
    }

    return;
}





int main(
    int argc,
    char *argv[])
{

    char lineBuf[1024]; /* how long a single line be? */
    int converted;
    int lineNo = 0;
    int cnt;

    FILE *fp;

    int junkInt1, junkInt2, junkInt3;
    float junkFloat1;
    float jitter_ms;

#define MAX_SAVE_BUFFER 1000 /* How many values will be picked up while searching for
                          a % disk full line (i.e. before they can be printed out)
                        */
    int saveJitter[MAX_SAVE_BUFFER]; /* lets us record multiple jitter values that exceed
                            our threshold till we find a "df" field- which is when
                            we can o/p all these values.
                         */
    int dataLineNo[MAX_SAVE_BUFFER]; /* The saved line #'s for the above. Printed if debug specified. */

    int saveJitterCnt = 0;
    int lookFor_df = FALSE;
    int dfPercent = -1; /* will be >= 0 if at least one found. The init value is a flag. */

    char junkStr1[500], junkStr2[500];

    HandleCmdLineArgs(argc, argv);

    if((fp = fopen(LogFile, "r")) == NULL)
    {
        printf("Unable to open input log file %s for read.\b", LogFile);
        perror("Error:");
        exit(1);
    }



    while(fgets(lineBuf, sizeof(lineBuf), fp) != NULL)
    {
        lineNo++;


        /* Are we looking for a "df" o/p line? (to see how full
           the flash is?)*/

        /* is there a "%" in this line? */
        if((strstr(lineBuf, "%") != NULL) && (lookFor_df))
        {
            converted = sscanf(lineBuf, "%s %i %i %i %i\n",
                               junkStr1, &junkInt1, &junkInt2, &junkInt3, &dfPercent);
            if(converted < 5)
            {
                printf("Line %i contains \"%%\", but expected fields not found. Skipping.\n", lineNo);
            }else
            {
                /* Now print out the saved jitter values (in col2) with this dfPercent value as the col1. */
                for(cnt = 0; cnt < saveJitterCnt; cnt++)
                {
                    if(Debug)
                    {
                        fprintf(stderr, "%i\t%i\t%i\n", (int)dataLineNo[cnt],
                                dfPercent, (int)saveJitter[cnt]);
                    }else
                    {
                        fprintf(stderr, "%i\t%i\n", dfPercent, (int)saveJitter[cnt]);
                    }


                }

                saveJitterCnt = 0; /* all flushed. Reset for next saves. */
                lookFor_df = FALSE;
            }

        }


        /* is there a "ms" in this line?*/
        if(strstr(lineBuf, "ms") == NULL)
        {
            continue;
        }

        /* grab the ms jitter value */
        converted = sscanf(lineBuf, "%f %s %f %s\n", &junkFloat1, junkStr1, &jitter_ms, junkStr2);
        if(converted < 4)
        {
            printf("Line %i contains \"ms\", but expected fields not found. Converted %i, Skipping.",
                   lineNo, converted);
            printf("1=%i, 2=%s.\n", junkInt1, junkStr1);
            continue; /* not our jitter line*/
        }

        /* Is the jitter value > threshold value? */
        if(abs(jitter_ms) > JitterThreshold_ms)
        {
            /* Found a jitter line that matches our crietrion.
               Now set flag to be on the look out for the next
               "df" output so that we can see how full the flash is.
            */

            if(saveJitterCnt < MAX_SAVE_BUFFER)
            {
                saveJitter[saveJitterCnt] = (int)abs(jitter_ms); /* why keep the (ms) jitter in float */
                dataLineNo[saveJitterCnt] = lineNo;
                saveJitterCnt++;
                lookFor_df = TRUE;
            }
            else
            {
                printf("Oops! I've run out of buffer space before I found a %% use line. Dropping itter value. Increase MAX_SAVE_BUFFER and recompile.\n");
            }


        }

    }


    /* Now print out any saved jitter values that were not printed out because we did not find
       and "df" after these were picked up. Only print if a "df" disk usage was ever found.
     */
    if(lookFor_df && (dfPercent >= 0))
    {
        /* Now print out the saved jitter values (in col2) with this dfPercent value as the col1. */
        for(cnt = 0; cnt < saveJitterCnt; cnt++)
        {
            fprintf(stderr, "%i\t%i\n", dfPercent, (int)saveJitter[cnt]);
        }
    }

    return 0;


}/* end main() */