/[PAMELA software]/quicklook/dataToXML/Data/compilationInfo/src/INFN/gen_mcmds.c
ViewVC logotype

Annotation of /quicklook/dataToXML/Data/compilationInfo/src/INFN/gen_mcmds.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Tue Apr 25 09:00:20 2006 UTC (18 years, 8 months ago) by kusanagi
Branch point for: MAIN
File MIME type: text/plain
Initial revision

1 kusanagi 1.1 /* Note for input file format:
2    
3     should declare first V,then A, then T all grouped by type
4    
5     */
6     #include <stdio.h>
7     #include <stdlib.h>
8    
9     #define FLISTNAME "PRH_ParamHandler_INFN_auto.id"
10     #define TRUE 1
11     #define FALSE 0
12     #define MAXMODE 2
13    
14     #define SETPARAMETERGEN 0x20
15     #define TESTDEBUG 0x43
16    
17     struct list_el
18     {
19     struct list_el *next;
20     char string[255];
21     int id;
22     };
23    
24     typedef struct
25     {
26     char str[255];
27     unsigned char code;
28     } sub_struct;
29    
30     typedef struct list_el listItem;
31    
32    
33     listItem *beginList,*beginCommand=NULL;
34     unsigned char bufferOut[2048];
35     int subid;
36     sub_struct subCommandMode[MAXMODE]={{"SetParameterGen",SETPARAMETERGEN},{"TestDebug",TESTDEBUG}};
37    
38    
39     void convertHex2Dec(char *str)
40     {
41     char tmp[255]="";
42     char dec[10]="";
43     char *p,*s;
44     unsigned int value;
45    
46     if ((p = strstr(str,"0x")) != NULL)
47     {
48     strncat(tmp,str,p-str);
49     sscanf(p+2,"%x",&value);
50     sprintf(dec,"%d",value);
51     strcat(tmp,dec);
52     memcpy(str,tmp,strlen(tmp));
53     str[strlen(tmp)]=0;
54     }
55     }
56    
57     int loadList(char * filename,listItem **first,int command)
58     {
59     FILE *fileList;
60     char *s;
61     char tmp[255],tmp_1[255];
62    
63     int ret = TRUE;
64    
65     listItem *loc=NULL,*cur;
66    
67     if ((fileList = fopen(filename,"r")) != NULL)
68     {
69     while (fgets(tmp,254,fileList) != NULL )
70     {
71     cur = (listItem*)malloc(sizeof(listItem));
72    
73     if (loc == NULL)
74     {
75     *first = cur; loc = cur;
76     cur->next = NULL;
77     }
78     else
79     {
80     loc->next = cur;
81     loc = cur;
82     cur->next = NULL;
83     }
84    
85     if (command == TRUE)
86     {
87     strncpy(cur->string,tmp,strlen(tmp)-1);
88     }
89     else
90     {
91     sscanf(tmp,"%s %d\n",tmp_1,&ret);
92     strncpy(cur->string,tmp_1,strlen(tmp_1));
93     }
94     cur->id = ret;
95     }
96     ret = TRUE;
97     fclose(fileList);
98     }
99     else
100     {
101     printf("Cannot open file %s!!!\n",FLISTNAME);
102     ret = FALSE;
103     }
104    
105     return(ret);
106     }
107    
108     void parseCommand()
109     {
110     listItem *loc;
111     char fileName[255];
112     int count = 0;
113     int VCount = 0,VFirst = TRUE,VSave,VInc;
114     int ACount = 0,AFirst = TRUE,ASave,AInc;
115     int TCount = 0,TFirst = TRUE,TSave,TInc;
116    
117     loc = beginCommand;
118     memset(bufferOut,0,2048);
119    
120     while (loc != NULL)
121     {
122     if (count == 0)
123     {
124     if ((loc->string[0] == 0x0a) || (loc->string[0] == 0x0))
125     {
126     printf("Finished !");
127     exit(0);
128     }
129    
130     strncpy(fileName,loc->string,strlen(loc->string)+1);
131     loc = loc->next;
132     count++;
133    
134     if (strcmp(loc->string,""))
135     printf("Processing file: %s\n",fileName);
136    
137     continue;
138     }
139    
140     if (count == 1)
141     {
142     if ((subid = returnID(loc->string)) != -1)
143     {
144     bufferOut[0] = 0;
145     bufferOut[1] = subid;
146     loc = loc->next;
147     count+=3;
148     continue;
149     }
150     else
151     {
152     printf("Fatal Error: unknown subcommand %s\n",loc->string);
153     exit(1);
154     }
155     }
156    
157     if (strcmp(loc->string,""))
158     printf("Processing: %s \n",loc->string);
159    
160     convertHex2Dec(loc->string);
161    
162     switch (subid) // last subid
163     {
164     case SETPARAMETERGEN :
165    
166     switch (loc->string[0])
167     {
168     case 'V' :
169     {
170     char type[255],name[255];
171     unsigned int value,id;
172    
173     sscanf(loc->string,"%s %s %d\n",type,name,&value);
174    
175     if (VFirst)
176     {
177     VSave = count; // the place for the command number
178     VFirst = FALSE;
179     VInc = 1; // do not consider N after first time
180     }
181    
182     if ((id = scanList4ID(name)) != -1)
183     {
184     bufferOut[count+VInc] = id;
185     bufferOut[count+1+VInc] = ((value & 0xff000000) >> 24);
186     bufferOut[count+2+VInc] = ((value & 0x00ff0000) >> 16);
187     bufferOut[count+3+VInc] = ((value & 0x0000ff00) >> 8);
188     bufferOut[count+4+VInc] = value & 0x000000ff;
189    
190     count+=(5+VInc);
191     VCount++;
192     VInc = 0;
193     }
194     else
195     {
196     printf("Fatal Error: unknown macrocommand %s\n",loc->string);
197     exit(1);
198     }
199    
200     if (loc->next)
201     if (loc->next->string[0] != loc->string[0])
202     bufferOut[VSave] = VCount;
203     }
204     break;
205    
206     case 'A' :
207     {
208     char type[255],name[255];
209     unsigned int value,id,index;
210    
211     if (VFirst) // write 0 if V is not present
212     {
213     bufferOut[count] = 0;
214     count++;
215     VFirst = 0;
216     }
217    
218     sscanf(loc->string,"%s %s %d %d\n",type,name,&index,&value);
219    
220     if (AFirst)
221     {
222     ASave = count; // the place for the command number
223     AFirst = FALSE;
224     AInc = 1;
225     }
226    
227     if ((id = scanList4ID(name)) != -1)
228     {
229     bufferOut[count+AInc] = id;
230     bufferOut[count+1+AInc] = index;
231     bufferOut[count+2+AInc] = ((value & 0xff000000) >> 24);
232     bufferOut[count+3+AInc] = ((value & 0x00ff0000) >> 16);
233     bufferOut[count+4+AInc] = ((value & 0x0000ff00) >> 8);
234     bufferOut[count+5+AInc] = value & 0x000000ff;
235     count+=(6+AInc);
236     ACount++;
237     AInc = 0;
238     }
239     else
240     {
241     printf("Fatal Error: unknown macrocommand %s\n",loc->string);
242     exit(1);
243     }
244    
245     if (loc->next)
246     if (loc->next->string[0] != loc->string[0])
247     bufferOut[ASave] = ACount;
248     }
249     break;
250    
251     case 'T' :
252     {
253     char type[255],name[255];
254     unsigned int value,id,row,col;
255    
256     sscanf(loc->string,"%s %s %d %d %d\n",type,name,&row,&col,&value);
257    
258     if (VFirst) // write 0 if V is not present
259     {
260    
261     bufferOut[count] = 0;
262     count++;
263     VFirst = 0;
264     }
265    
266     if (AFirst) // write 0 if V is not present
267     {
268     bufferOut[count] = 0;
269     count++;
270     AFirst = 0;
271     }
272    
273     if (TFirst)
274     {
275     TSave = count; // the place for the command number
276     TFirst = FALSE;
277     TInc = 1;
278     }
279    
280     if ((id = scanList4ID(name)) != -1)
281     {
282     bufferOut[count+TInc] = id;
283     bufferOut[count+1+TInc] = row;
284     bufferOut[count+2+TInc] = col;
285     bufferOut[count+3+TInc] = ((value & 0xff000000) >> 24);
286     bufferOut[count+4+TInc] = ((value & 0x00ff0000) >> 16);
287     bufferOut[count+5+TInc] = ((value & 0x0000ff00) >> 8);
288     bufferOut[count+6+TInc] = value & 0x000000ff;
289    
290     count+=(7+TInc);
291     TCount++;
292     TInc = 0;
293     }
294     else
295     {
296     printf("Fatal Error: unknown macrocommand %s\n",loc->string);
297     exit(1);
298     }
299    
300     if (loc->next)
301     if (loc->next->string[0] != loc->string[0])
302     bufferOut[TSave] = TCount;
303     }
304     break;
305     case 0 :
306     {
307     int c;
308    
309     if (VFirst) // write 0 if V is not present
310     {
311     bufferOut[count] = 0;
312     count++;
313     }
314    
315     if (AFirst) // write 0 if V is not present
316     {
317     bufferOut[count] = 0;
318     count++;
319     }
320    
321     if (TFirst) // write 0 if V is not present
322     {
323     bufferOut[count] = 0;
324     count++;
325     }
326    
327     c = count;
328    
329     while ((count % 4) != 0)
330     count++;
331    
332     memset(&bufferOut[c],0,count-c);
333    
334     bufferOut[2] = (((count-4)/4) & 0x0100) >> 8;
335     bufferOut[3] = ((count-4)/4) & 0x00ff;
336    
337     if (!write2File(fileName,count))
338     {
339     printf("Error writing on file %s\n",fileName);
340     exit(1);
341     }
342    
343     count = 0;
344     VCount = 0; VFirst = TRUE;
345     ACount = 0; AFirst = TRUE;
346     TCount = 0; TFirst = TRUE;
347     }
348     break;
349    
350     default :
351     printf("Fatal Error : variable identifier not known !\n");
352     exit(1);
353     }
354     break;
355    
356     case TESTDEBUG:
357     {
358     unsigned int value;
359    
360     if (loc->string[0])
361     {
362     sscanf(loc->string,"%d\n",&value);
363    
364     bufferOut[count] = ((value & 0xff00) >> 8);
365     bufferOut[count+1] = value & 0x00ff;
366     count+=2;
367     }
368     else
369     {
370     bufferOut[2] = 0;
371     bufferOut[3] = 1;
372    
373     if (!write2File(fileName,count))
374     {
375     printf("Error writing on file %s\n",fileName);
376     exit(1);
377     }
378    
379     count = 0;
380     }
381    
382     }
383     break;
384     }
385    
386     loc = loc->next;
387    
388     }
389     }
390    
391     int returnID(char *key)
392     {
393     int i;
394    
395     for (i=0; i < MAXMODE; i++)
396     {
397     if (strncmp(key,subCommandMode[i].str,strlen(subCommandMode[i].str)) == 0)
398     return subCommandMode[i].code;
399     }
400     return(-1);
401     }
402    
403     int scanList4ID(char *name)
404     {
405     listItem *loc;
406    
407     loc = beginList;
408    
409     while (loc != NULL)
410     {
411     if (strncmp(name,loc->string,strlen(loc->string)) == 0)
412     return loc->id;
413     loc = loc->next;
414     }
415     return(-1);
416     }
417    
418    
419     int write2File(char *filename,int count)
420     {
421     FILE *out;
422     int ret = TRUE;
423     int i = 0,c;
424     char binname[255];
425     unsigned short data;
426    
427     c = count;
428    
429     if ((out = fopen(filename,"w")) != NULL)
430     {
431     count = count / 2;
432    
433     while (count--)
434     {
435     fprintf(out,"0x%02x%02x\n",bufferOut[i],bufferOut[i+1]);
436     i+=2;
437     }
438     fclose(out);
439     }
440     else
441     ret = FALSE;
442    
443    
444     strcpy(binname,filename);
445     strcat(binname,".bin");
446    
447     if ((out = fopen(binname,"w")) != NULL)
448     {
449     c = c / 2; i = 0;
450    
451     while (c--)
452     {
453     data = *(unsigned short*)&bufferOut[i];
454     fputc((unsigned char)((data & 0xff00) >> 8),out);
455     fputc((unsigned char)((data & 0x00ff)),out);
456     i+=2;
457     }
458    
459     fclose(out);
460     }
461     else
462     ret = FALSE;
463    
464     return(ret);
465     }
466    
467     void printList(listItem *first)
468     {
469     listItem *loc;
470    
471     loc = first;
472    
473     while (loc != NULL)
474     {
475     printf("%s %d\n",loc->string,loc->id);
476     loc = loc->next;
477     }
478     }
479     int main (int argc,char *argv[])
480     {
481     if (argc > 1)
482     {
483     loadList(FLISTNAME,&beginList,FALSE);
484     loadList(argv[1],&beginCommand,TRUE);
485    
486     printf("Processing file %s\n\n",argv[1]);
487    
488     parseCommand();
489     }
490     else
491     printf("\nMissing filename !!\n");
492     return 0;
493     }
494    
495    

  ViewVC Help
Powered by ViewVC 1.1.23