Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1171 giacomo 1
/*
2
 * Project: S.Ha.R.K.
3
 *
4
 * Coordinators:
5
 *   Giorgio Buttazzo    <giorgio@sssup.it>
6
 *   Paolo Gai           <pj@gandalf.sssup.it>
7
 *
8
 * Authors     :
9
 *              Bera Marco              mbera@libero.it
10
 *              Varasio Gabriele        varasio@odino.unipv.it
11
 *
12
 * Universita' degli studi di Pavia
13
 *
14
 * http://www.sssup.it
15
 * http://retis.sssup.it
16
 * http://shark.sssup.it
17
 */
18
 
19
/**
20
 ------------
21
 CVS :        $Id: tel.c,v 1.1 2003-06-04 09:41:01 giacomo Exp $
22
 
23
 File:        $File$
24
 Revision:    $Revision: 1.1 $
25
 Last update: $Date: 2003-06-04 09:41:01 $
26
 ------------
27
**/
28
 
29
/*
30
 * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
31
 *
32
 * This program is free software; you can redistribute it and/or modify
33
 * it under the terms of the GNU General Public License as published by
34
 * the Free Software Foundation; either version 2 of the License, or
35
 * (at your option) any later version.
36
 *
37
 * This program is distributed in the hope that it will be useful,
38
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
39
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
40
 * GNU General Public License for more details.
41
 *
42
 * You should have received a copy of the GNU General Public License
43
 * along with this program; if not, write to the Free Software
44
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
45
 *
46
 */
47
 
48
/****************************************************************/
49
/*      PERIODIC PROCESS TEST                                   */
50
/****************************************************************/
51
 
52
#include <ll/i386/x-dos.h>
53
#include <kernel/kern.h>
54
#include <modules/cabs.h>
55
#include <drivers/glib.h>
56
#include <drivers/keyb.h>
57
#include <math.h>
58
#include <semaphore.h>
59
#include <stdlib.h>
60
#include "moon.h"
61
 
62
 
63
#define N_MAX_TELESCOPI 5
64
#define X0      10
65
#define pi      3.14
66
#define ex       2.71
67
#define NCAB    N_MAX_TELESCOPI+1
68
#define dim_msg 8
69
#define dim_x 49
70
#define dim_y 49
71
#define radius 9
72
#define Y_TELESCOPI 300
73
/* task periods */
74
#define PERIOD_T1  80000
75
#define PERIOD_T4 100000
76
#define PERIOD_T5 100000
77
#define WCET_T 5000
78
int period_t1=0;
79
#define SOGLIA 8
80
 
81
char    *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4","cab5","cab6"};
82
 
83
// posizioni dei telescopi e rispettivi poli
84
 
85
int     x[5] = {100, 200, 300, 400,500};
86
//double  poli[5]={-50,-30,-1, -20, -5};
87
double  poli[5];
88
// guadagno proporzionale
89
double kp=0.0;
90
// flag per rilevare la pressione del tasto spazio
91
int numero_telescopi=0;
92
int flag=0;
93
KEY_EVT         move_tasto;
94
// Immagini ausiliarie per il disegno della luna
95
BYTE lunabkg[900];
96
BYTE lunadest[900];
97
 
98
 
99
/* A semaphore used to access Video Cards in mutual exclusion */
100
sem_t   mutex;
101
sem_t   mutex_tasto;
102
 
103
/***************************************************************/
104
 
105
// cab necessari allo scambio delle coordinate dell'oggetto e delle
106
// immagini dei rispettivi telescopi
107
 
108
CAB   cid[NCAB];
109
 
110
// vettori per memorizzare le immagini
111
BYTE videobuf[dim_x*dim_y];
112
BYTE videobuf1[dim_x*dim_y];
113
BYTE videobuf2[dim_x*dim_y];
114
BYTE videobuf3[dim_x*dim_y];
115
BYTE videobuf4[dim_x*dim_y];
116
BYTE videobuf5[dim_x*dim_y];
117
 
118
 // Variabili per il disegno delle stelle sullo sfondo
119
 int num_p;
120
 int y_p[7];
121
 int x_p[7];
122
 int dim_p[7];
123
 int col_p[7];
124
 
125
 
126
 
127
TASK    media(void *arg)
128
{
129
char *p;
130
 
131
int i=0;
132
int j=0;
133
while(1)
134
{
135
        p = cab_getmes(cid[1]);
136
        memcpy(videobuf,p,dim_x*dim_y*sizeof(BYTE));
137
        cab_unget(cid[1], p);
138
        p = cab_getmes(cid[2]);
139
        memcpy(videobuf1,p,dim_x*dim_y*sizeof(BYTE));
140
        cab_unget(cid[2], p);
141
        p = cab_getmes(cid[3]);
142
        memcpy(videobuf2,p,dim_x*dim_y*sizeof(BYTE));
143
        cab_unget(cid[3], p);
144
        p = cab_getmes(cid[4]);
145
        memcpy(videobuf4,p,dim_x*dim_y*sizeof(BYTE));
146
        cab_unget(cid[4], p);
147
 
148
        p = cab_getmes(cid[5]);
149
        memcpy(videobuf5,p,dim_x*dim_y*sizeof(BYTE));
150
        cab_unget(cid[5], p);
151
 
152
        // calcolo media
153
 
154
        for (i=0;i<dim_x;i++)
155
 
156
        {
157
                for(j=0;j<dim_y;j++)
158
                {
159
                videobuf3[i*dim_x+j]=(double)(videobuf[i*dim_x+j]+videobuf1[i*dim_x+j]+videobuf2[i*dim_x+j]+videobuf4[i*dim_x+j]+videobuf5[i*dim_x+j])/numero_telescopi;
160
                }
161
        }
162
 
163
        // visualizza immagine mediata
164
        sem_wait(&mutex);
165
        grx_putimage(570,10,570+dim_x-1,10+dim_y-1,videobuf3);
166
        sem_post(&mutex);      
167
        task_endcycle();
168
     }
169
}
170
 
171
TASK    move(void *arg)
172
{
173
//int     i = (int)arg;
174
char *p;
175
int x_object=300;  // posizione dell'oggetto da rilevare
176
int y_object=200;
177
// variabile contatore
178
int z=0;
179
char coord_x[dim_msg];
180
p = cab_reserve(cid[0]);
181
sprintf(coord_x,"%d %d",x_object,y_object);
182
memcpy(p,coord_x,dim_msg*sizeof(char));
183
cab_putmes(cid[0], p);
184
 
185
      //Normalizzazione
186
      for(z=0;z<900;z++)
187
        {
188
        if (luna[z]>0)
189
                {
190
                luna[z]=((luna[z])*16.0/255.0)+16;
191
                }
192
 
193
        }
194
 
195
 
196
        task_endcycle();
197
        while (1)
198
        {
199
 
200
        // Cancellazione Luna
201
        sem_wait(&mutex);      
202
        grx_box(x_object-15,y_object-15,x_object+14,y_object+14,0);
203
        sem_post(&mutex);
204
        if (keyb_getcode(&move_tasto,NON_BLOCK))
205
                {
206
                       if (move_tasto.ascii=='4')    
207
                       x_object=x_object-5;      
208
                       if (move_tasto.ascii=='6')            
209
                       x_object=x_object+5;
210
                       if (move_tasto.ascii=='2')
211
                       y_object=y_object+5;
212
                       if (move_tasto.ascii=='8')
213
                       y_object=y_object-5;
214
                       if (move_tasto.ascii=='9'){    
215
                       y_object=y_object-5;                
216
                       x_object=x_object+5; }      
217
                       if (move_tasto.ascii=='1'){    
218
                       y_object=y_object+5;                
219
                       x_object=x_object-5; }
220
                       if (move_tasto.ascii=='7'){    
221
                       y_object=y_object-5;                
222
                       x_object=x_object-5; }
223
                       if (move_tasto.ascii=='3'){    
224
                       y_object=y_object+5;
225
                    x_object=x_object+5;}
226
                    if (move_tasto.ascii==' '){
227
                    sem_wait(&mutex_tasto);
228
                    flag=1;
229
                            if(numero_telescopi<N_MAX_TELESCOPI)
230
                            {
231
                            numero_telescopi++;
232
                            }
233
                    sem_post(&mutex_tasto);
234
                    }
235
              //CONTROLLI SULLA POSIZIONE
236
                       if(y_object<(dim_y/2+70)) y_object=dim_y/2+70;
237
                       if(y_object>(240-dim_y/2)) y_object=(240-dim_y/2);
238
                       if(x_object<(dim_x/2+20 )) x_object=dim_x/2+20;
239
                       if(x_object>(630-dim_x/2-10)) x_object=(630-dim_x/2-10);
240
                }
241
                p = cab_reserve(cid[0]);
242
                sprintf(coord_x,"%d %d",x_object,y_object);
243
                memcpy(p,coord_x,dim_msg*sizeof(char));
244
                cab_putmes(cid[0], p);
245
 
246
        for(z=0;z<7;z++)
247
        {
248
        if (sqrt(pow((x_object-x_p[z]),2)+pow((y_object-y_p[z]),2))<20+dim_p[z]+radius)
249
                        grx_disc(x_p[z],y_p[z],dim_p[z],col_p[z]);        
250
        }
251
 
252
 
253
        sem_wait(&mutex);
254
        // Gestione sfondo
255
        grx_getimage(x_object-15,y_object-15,x_object+14, y_object+14,lunabkg);
256
        for(z=0;z<900;z++)
257
        {
258
         if( luna[z]==0 && lunabkg!=0 )
259
          {
260
                lunadest[z]=lunabkg[z];
261
          }
262
         else
263
          {
264
         lunadest[z]=luna[z];
265
          }
266
        }
267
        grx_putimage(x_object-15,y_object-15,x_object+14, y_object+14,lunadest);
268
        sem_post(&mutex);
269
        task_endcycle();
270
        }
271
}
272
 
273
 
274
TASK    tele(void *arg)
275
{
276
int     i = (int)arg;
277
int     passi;
278
char    s[100];
279
int x_object=300;  // posizione dell'oggetto da rilevare
280
int y_object=200;
281
int x_start=500;   // posizione iniziale dei telescopi
282
int y_start=190;
283
int x_current=x_start; // posizione corrente dei telescopi
284
int y_current=y_start;
285
int x_current_d[9];
286
int y_current_d[9];
287
int y= Y_TELESCOPI;  // coordinata y dei telescopi
288
double alpha_new=atan((y-(double)y_current)/((x[i]-(double)x_current)));
289
double alpha=alpha_new;
290
double distance=0.0;
291
double alpha_target=0.0;
292
double tc=0.1;
293
double u=0.0;
294
double u_old=0.0;
295
double errore=0.0;
296
double delta_x=0;
297
double delta_y=0;
298
 
299
char *p;
300
//int j=0;
301
// indice matrice per aggiunta di rumore
302
int k=0;
303
int q=0;
304
double polo=poli[i];
305
int val=0;
306
 
307
 
308
 
309
BYTE videobuf[dim_x*dim_y];
310
 
311
        passi = 0;
312
        //srand(i);
313
        //srand(i+sys_gettime(NULL));
314
        alpha_target=atan((y-(double)y_object)/((double)x_object-x[i]));      
315
 
316
        sem_wait(&mutex);
317
        grx_text("targ",4,340,12,0);
318
        sprintf(s,"%f",poli[i]);
319
        grx_text(s,x[i],y+60,12,0);
320
        grx_text("polo",4,y+60,12,0);
321
        grx_text("new",4,y+50,12,0);
322
        sprintf(s,"%1.6f",alpha_target);
323
        grx_text(s, x[i]-25,y+50,12,0);
324
        grx_rect(x[i]-40,y+25,x[i]+40,y+85,2);
325
        grx_rect(x[i]-40,y+90,x[i]+40,y+150,2);
326
        sem_post(&mutex);
327
 
328
        // Disegno telescopio
329
        grx_disc(x[i],y,19,i+1);
330
        grx_box( x[i]-19,y,x[i]+19,y+20,i+1);
331
 
332
 
333
        task_endcycle();
334
 
335
        while (1) {
336
                // legge di controllo
337
                passi++;
338
                //sprintf(s,"%d",passi);
339
                //grx_text(s, 50,110,12,0);
340
                p = cab_getmes(cid[0]);
341
                sscanf(p,"%d %d",&val,&y_object);
342
                cab_unget(cid[0], p);
343
                x_object=val;      
344
                alpha_target=atan((y-(double)y_object)/((double)x_object-x[i]));
345
                if (alpha_target <0)
346
                {
347
                alpha_target=3.14+alpha_target;
348
                }
349
 
350
                errore=alpha_target-alpha_new;
351
                u=u_old+kp*tc*errore;
352
                //alpha_new=0.13*alpha+0.87*u;
353
                alpha_new=(exp(polo*tc))*alpha+(1-exp(polo*tc))*u;
354
                u_old=u;
355
                alpha=alpha_new;
356
 
357
                // implementazione dei limiti degli attuattori
358
                if (alpha_new > 3.14)
359
                        alpha_new=3.14;
360
                if (alpha_new <0)
361
                        alpha_new=0;
362
 
363
                distance=sqrt(((y-y_object)*(y-y_object))+((x_object-x[i])*(x_object-x[i])));
364
 
365
                sem_wait(&mutex);
366
              // Cancello braccio telescopio
367
              if (passi>1)
368
              {
369
                      for (k=0; k<9 ; k++)
370
                        {
371
                        grx_line(delta_x,delta_y,x_current_d[k],y_current_d[k],0);
372
                        }
373
             }
374
                x_current=x[i]+distance*cos(alpha_new);
375
                y_current=300-distance*sin(alpha_new);
376
 
377
                // lettura immagine
378
 
379
                grx_getimage(x_current-(dim_x/2),y_current-(dim_y/2),x_current+(dim_x/2),y_current+(dim_y/2),videobuf);
380
 
381
                //aggiunta rumore
382
 
383
                sem_post(&mutex);
384
                for (k=0;k<dim_x;k++)
385
                {
386
                        for(q=0;q<dim_y;q++)
387
                        {
388
                        int num=0;
389
                                num=rand();
390
                                num=(num%10)+1;
391
                                if (num>SOGLIA)
392
                                {
393
                                videobuf[k*dim_x+q]=videobuf[k*dim_x+q]+1;
394
                                }
395
                        }
396
                }
397
                sem_wait(&mutex);
398
 
399
                grx_putimage(x[i]-25,y+92,x[i]-25+dim_x-1,y+92+dim_y-1,videobuf);
400
 
401
                sprintf(s,"%3.4f",(180*(alpha_target/pi)));
402
                grx_text(s, x[i]-25,y+40,12,0);
403
                sprintf(s,"%3.4f",180*(alpha_new/pi));
404
                grx_text(s, x[i]-25,y+50,12,0);
405
 
406
                delta_x=x[i]+20*cos(alpha_new);
407
                delta_y=y-20*sin(alpha_new);  
408
 
409
                for ( k=0; k<9 ; k++) {
410
                x_current_d[k]=x[i]+50*cos(alpha_new+(k-4)*0.01);
411
                y_current_d[k]=300-50*sin(alpha_new+(k-4)*0.01);  }
412
 
413
             // Disegno braccio telescopio
414
                for(k=0 ; k<9 ; k++)
415
                 grx_line(delta_x,delta_y,x_current_d[k],y_current_d[k],i+1);
416
 
417
                sem_post(&mutex);
418
 
419
                // scrive immagine nel cab
420
                p = cab_reserve(cid[i+1]);
421
                memcpy(p,videobuf,dim_x*dim_y*sizeof(BYTE));
422
                cab_putmes(cid[i+1], p);
423
 
424
              task_endcycle();
425
 
426
        }
427
 
428
}
429
 
430
 
431
/****************************************************************/
432
 
433
/* This is the exception handler. It is called when an exception
434
   is raised.
435
   It exits from the graphical mode, then it prints a message and
436
   shutdown the kernel using sys_abort()
437
*/
438
 
439
void demo_exc_handler(int signo, siginfo_t *info, void *extra)
440
{
441
  struct timespec t;
442
 
443
  grx_close();
444
 
445
  /* Default action for an kern exception is  */
446
  kern_cli();
447
  ll_gettime(TIME_EXACT, &t),
448
  kern_printf("\nS.Ha.R.K. Exception raised!!!"
449
              "\nTime (s:ns)     :%ld:%ld"
450
              "\nException number:%d (numbers in include/bits/errno.h)"
451
              "\nPID             :%d\n",
452
              t.tv_sec, t.tv_nsec, info->si_value.sival_int,
453
              info->si_task);
454
  sys_abort(1);
455
}
456
 
457
/******************************************************************/
458
 
459
/* This function is called when Alt-X is pressed.
460
   It simply shutdown the system using sys_end.
461
   Note that the byebye() function is called only if we exit from
462
   the system using sys_end()!!!!
463
*/
464
void my_end(KEY_EVT* e)
465
{
466
        sys_end();
467
}
468
 
469
/******************************************************************/
470
 
471
/* This function is called when the system exit correctly after Alt-X.
472
   It exits from the graphic mode and then it prints a small greeting.
473
   Note that:
474
   - The function calls grx_exit, so it must be registered using
475
     RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
476
     at that point the kernel is already returned in real mode!!!)
477
   - When an exception is raised, the exception handler is called.
478
     Since the exception handler already exits from the graphic mode,
479
     this funcion has not to be called. For this reason:
480
     . we registered byebye using the flag NO_AT_ABORT
481
     . the exception handler exits using sys_abort; in that way byebye is
482
       NOT called
483
*/
484
 
485
void byebye(void *arg)
486
{
487
  grx_close();
488
  kern_printf("Bye Bye!\n");
489
}
490
 
491
/****************************** MAIN ******************************/
492
 
493
int main(int argc, char **argv)
494
{
495
  PID             pid1, pid4,pid5;
496
  KEY_EVT         emerg;
497
  int i=0;  
498
  int z=0; // contatore per disegno dei pianeti
499
  HARD_TASK_MODEL m1, m4,m5;
500
  //FILE *fp;
501
 
502
  struct sigaction action;
503
 
504
  cid[0] = cab_create(cname[0], dim_msg, 5);
505
  cid[1] = cab_create(cname[1], dim_x*dim_y, 3);
506
  cid[2] = cab_create(cname[2], dim_x*dim_y, 3);
507
  cid[3] = cab_create(cname[3], dim_x*dim_y, 3);
508
  cid[4] = cab_create(cname[4], dim_x*dim_y, 4);
509
  cid[5] = cab_create(cname[5], dim_x*dim_y, 3);
510
  cid[6] = cab_create(cname[6], dim_x*dim_y, 3);
511
 
512
  /*fp=fopen("file.txt","r");
513
  fscanf(fp,"%d",a);
514
  fclose(fp);
515
  */
516
 
517
        /* Init the standard S.Ha.R.K. exception handler */
518
        action.sa_flags = SA_SIGINFO;            /* Set the signal action */
519
        action.sa_sigaction = demo_exc_handler;
520
        action.sa_handler = 0;
521
        sigfillset(&action.sa_mask); /* we block all the other signals... */
522
 
523
        if (sigaction(SIGHEXC, &action, NULL) == -1) {  /* set the signal */
524
          perror("Error initializing signals...");
525
          sys_end();
526
        }
527
 
528
        /* Set the closing function */
529
        sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
530
 
531
        /* Initializes the semaphore */
532
        sem_init(&mutex,0,1);
533
 
534
        /* graphic card Initialization */
535
        if (grx_init() < 1) {
536
           sys_abort(1);
537
        }
538
 
539
        if (grx_open(640, 480, 8) < 0) {
540
            kern_printf("GRX Err\n");
541
            sys_abort(1);
542
        }
543
        kern_printf("Video card ok!\n");
544
 
545
 
546
 
547
        /* set the keyboard handler to exit correctly */
548
        emerg.ascii = 'x';
549
        emerg.scan = KEY_X;
550
        emerg.flag = ALTL_BIT;
551
        keyb_hook(emerg,my_end);
552
 
553
        srand(i+sys_gettime(NULL));
554
 
555
        emerg.ascii = 'x';
556
        emerg.scan = KEY_X;
557
        emerg.flag = ALTR_BIT;
558
        keyb_hook(emerg,my_end);
559
        sem_wait(&mutex);
560
        /* a small banner */
561
        grx_clear(0);
562
 
563
        grx_text("REALTIME TELESCOPES di Marco Bera e Gabriele Varasio",8,8,WHITE,0);
564
        grx_text("Premere Spazio per creare un telescopio",8,22,WHITE,0);
565
        grx_text("Premere Alt-X per uscire",8,32,WHITE,0);
566
        grx_text("Usare il tastierino numerico per muovere l'oggetto",8,42,WHITE,0);
567
 
568
        // DISEGNARE BORDI
569
        grx_rect(1,1,638,478,2);
570
        grx_rect(558,1,638,61,2);
571
        grx_rect(1,1,638,61,2);
572
 
573
 
574
       // Disegno sfondo
575
        for(z=0;z<7;z++)
576
        {
577
        num_p=rand();
578
        y_p[z]=100+((num_p%130)+1);
579
        x_p[z]=50+((num_p%540)+1);
580
        dim_p[z]=2+((num_p%5)+1);
581
        col_p[z]=((num_p%10)+1);
582
        grx_disc(x_p[z],y_p[z],dim_p[z],col_p[z]);
583
        }    
584
        sem_post(&mutex);
585
 
586
 
587
        hard_task_default_model(m4);
588
        hard_task_def_ctrl_jet (m4);
589
        hard_task_def_arg      (m4, (void *)3);
590
        hard_task_def_wcet     (m4, 19000);
591
        hard_task_def_mit      (m4, PERIOD_T4);
592
        hard_task_def_group    (m4,1);
593
        pid4 = task_create("move", move, &m4, NULL);
594
        if (pid4 == NIL) {
595
          grx_close();
596
          perror("Could not create task <move>");
597
          sys_abort(1);
598
        }
599
        task_activate(pid4);
600
        hard_task_default_model(m5);
601
        hard_task_def_ctrl_jet (m5);
602
        hard_task_def_arg      (m5, (void *)3);
603
        hard_task_def_wcet     (m5, 19000);
604
        hard_task_def_mit      (m5, PERIOD_T5);
605
        hard_task_def_group    (m5,1);
606
        pid5 = task_create("media", media, &m5, NULL);
607
 
608
        if (pid5 == NIL) {
609
          grx_close();
610
          perror("Could not create task <move>");
611
          sys_abort(1);
612
        }
613
        task_activate(pid5);
614
        /* and finally we activate the three threads... */
615
 
616
 
617
 
618
        do {
619
        int val_flag=0;
620
        sem_wait(&mutex_tasto);
621
        val_flag=flag;
622
        sem_post(&mutex_tasto);
623
 
624
        if ((val_flag==1) && (i < N_MAX_TELESCOPI))
625
        {
626
        flag=0;
627
        hard_task_default_model(m1);
628
        hard_task_def_ctrl_jet (m1);
629
        hard_task_def_arg      (m1, (void *)i);
630
        hard_task_def_wcet     (m1, WCET_T);
631
//        hard_task_def_mit      (m1, PERIOD_T1);
632
        hard_task_def_mit      (m1, period_t1);
633
 
634
        hard_task_def_group    (m1,1);
635
        pid1 = task_create("tele1", tele, &m1, NULL);
636
        if (pid1 == NIL)
637
        {
638
          grx_close();
639
          perror("Could not create task <tele1>");
640
          sys_abort(1);
641
        }
642
            task_activate(pid1);
643
            i++;
644
        }
645
    } while (1);
646
 
647
        /*
648
           now the task main ends, but the system does not shutdown because
649
           there are others.
650
 
651
           The demo will finish if a Alt-X key is pressed.
652
        */
653
 
654
        return 0;
655
}
656
/*********** lettura da file ********************/
657
void read_cfg_file(int argc, char **argv)
658
{
659
  int err;
660
  DOS_FILE      *fp;
661
  char myfilebuf[1000];
662
  int myfilebuf_length;
663
 
664
 
665
 
666
  if (2)
667
  {
668
    fp = DOS_fopen("dati.cnf","r");
669
 
670
    if (fp)
671
    {
672
      /* read up to 1000 chars */
673
      myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
674
 
675
      /* check for errors */
676
      err = DOS_error();
677
 
678
      cprintf("Read %d bytes...\n", myfilebuf_length);
679
 
680
              if (err)
681
              {
682
                cprintf("Error %d reading file...Using default values\n", err);
683
              }
684
              else
685
              {
686
                //geti(myfilebuf, &pos, &NMouses);          // Number of Mouses
687
              sscanf(myfilebuf,"%lf %lf %lf %lf %lf %lf %d",&poli[0],&poli[1],&poli[2],&poli[3],&poli[4],&kp,&period_t1);
688
              }
689
 
690
      DOS_fclose(fp);
691
      return;
692
 
693
    }
694
    else {
695
      /* error!! */
696
      err = DOS_error();
697
      /* note that if you call DOS_error() here, it return 0!!! */
698
      cprintf("Error %d opening myfile.txt...Using default values\n", err);
699
    }
700
 
701
  }
702
  else {
703
    cprintf("Wrong number of arguments...\n");
704
    l1_exit(0);
705
  }
706
}
707
 
708
 
709
/****************************************************************/